最近我需要从一个字符串中提取一个数字,但是在真正的旧C上,不支持像strtok
这样的函数。我更喜欢sscanf
,但我无法理解。
请注意,整数是随机位置(用户定义)。
一般来说,这就是我想要的一个例子:
Input:
char * string = "He is 16 years old.";
Output:
16
答案 0 :(得分:2)
scanf尝试匹配模式....所以如果你知道字符串是“他已经16岁了”。其中16是你希望解码的整数。
(我认为你的输入字符串意味着你的格式有点自由形式。我假设它是可预测的。)
{
char* inputstr = "He is 16 years old.";
int answer = 0;
int params = sscanf (inputstr, "He is %d years old.", &answer);
if (params==1)
printf ("it worked %d",answer);
else
printf ("It failed");
}
答案 1 :(得分:1)
对于初学者,您应该知道strtok
功能也非常古老。它符合C89标准,但可能在之前的许多实现中存在(例如在1986年发布的4.3BSD中)。实际上,sscanf
函数可能比strtok
函数更新。
但是如果你有这样一个古老的编译器,实际上没有strtok
函数,和你的输入字符串不符合你在问题中的确切格式,但可以更自由形式(因此不能真正使用sscanf
的模式匹配功能),那么你必须手动解析字符串。
这种手动解析实际上可以非常简单,只需循环遍历字符串,直到找到一个数字,然后在构造数字时收集所有连续数字。一旦你得到一个非数字字符,你就有了你的号码。当然,这只会得到字符串中的第一个数字。
答案 2 :(得分:1)
数字过滤和sscanf()
的组合应该有效。
int GetNumber(const char *str) {
while (!(*str >= '0' && *str <= '9') && (*str != '-') && (*str != '+')) str++;
int number;
if (sscanf(str, "%d", &number) == 1) {
return number;
}
// No int found
return -1;
}
溢出的数字需要额外的工作。
一种较慢但又迂腐的方法
int GetNumber2(const char *str) {
while (*str) {
int number;
if (sscanf(str, "%d", &number) == 1) {
return number;
}
str++;
}
// No int found
return -1;
}
答案 3 :(得分:1)
#include <stdio.h>
int main() {
char * string = "He is 16 years old.";
int age;
if(sscanf(string, "%*[^0123456789]%d", &age)==1)
printf("%d\n", age);
else
printf("not found\n");
return 0;
}