如何从字符串中提取整数?

问题描述 投票:7回答:3

我正在做一个赋值,作为赋值的一部分,我需要从字符串中提取整数。

我尝试使用atoi()函数,但是它总是返回0,所以我切换到strtol(),但是它仍然返回0

目标是从字符串中提取整数并将其作为参数传递给其他函数。我正在使用一个函数,然后使用这些值来更新某些数据(update_stats)。

请记住,我对使用C语言进行编程还很陌生,但这是我的尝试:

void get_number (char str[]) {
    char *end;
    int num;
    num = strtol(str, &end, 10);
    update_stats(num);
    num = strtol(end, &end, 10);
    update_stats(num);
}

目的是在字符串"e5 d8"中(例如,我将从该字符串中提取58

字符串的格式始终相同。

我该怎么做?

c string-parsing
3个回答
7
投票

strtol不会find字符串中的数字。它将转换数字在字符串的开头。 (它确实跳过空格,但没有其他内容。)

如果需要查找数字的开头,可以使用类似以下内容的东西:

const char* nump = strpbrk(str, "0123456789");
if (nump == NULL) /* No number, handle error*/

([man strpbrk

如果您的电话号码可能已签名,则需要更复杂的功能。一种方法是执行上述操作,然后如果前一个字符为man strpbrk,则备份一个字符。但是请注意字符串的开头:

-

仅将if ( nump != str && nump[-1] == '-') --nump; 放在-参数中会在输入上产生错误的匹配,例如strpbrk


2
投票

我建议您自己编写逻辑。我知道,就像重新发明轮子,但是在那种情况下,您将了解库函数的实际工作方式。

这是我建议的功能:

non-numeric7

不要忘记在结尾加上long getNumber(str) char* str; { int i = 0; long num = 0; char ch = ' '; while (ch != '\0') { ch = *(str + i); if (ch >= '0' && ch <= '9') num = num * 10 + (long)(ch - 48); i++; } return num; } 的字符串:)


0
投票

如果格式总是这样,那么这也可以工作

\0

输出

#include <stdio.h>

int main()
{
    char *str[] = {"a5 d8", "fe55 eec2", "a5 abc111"};
    int num1, num2;

    for (int i = 0; i < 3; i++) {
      sscanf(str[i], "%*[^0-9]%d%*[^0-9]%d", &num1, &num2);
      printf("num1: %d, num2: %d\n", num1, num2);
    }
    return 0;
}

num1: 5, num2: 8 num1: 55, num2: 2 num1: 5, num2: 111 将匹配任何非数字字符。通过像这样添加%[^0-9]*表示将从字符串中读取数据,但将其忽略。

© www.soinside.com 2019 - 2024. All rights reserved.