我正在做一个赋值,作为赋值的一部分,我需要从字符串中提取整数。
我尝试使用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"
中(例如,我将从该字符串中提取5
和8
。
字符串的格式始终相同。
我该怎么做?
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
。
我建议您自己编写逻辑。我知道,就像重新发明轮子,但是在那种情况下,您将了解库函数的实际工作方式。
这是我建议的功能:
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
输出
#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]
,*
表示将从字符串中读取数据,但将其忽略。