int GetNumber(const char *str) {
while (!(*str >= '0' && *str <= '9') && (*str != '-') && (*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;
}
{
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");
}
对于初学者来说,您应该知道strtok函数也是相当古老的。它在C89标准中,但可能存在于之前的许多实现中(例如在1986年发布的4.3BSD中)。实际上,sscanf函数可能比strtok函数更新。 但是,如果您使用的编译器非常古老,并且实际上没有strtok函数,那么您的输入字符串 and 就不会遵循您在问题中使用的格式,而是可以使用更自由的格式(因此无法真正使用sscanf的模式匹配功能),那么您必须手动解析字符串。 这种手动解析实际上非常简单,只需循环字符串直到找到一个数字,然后在构造数字时收集所有连续的数字。一旦得到一个非数字字符,就得到了数字。当然,这只会得到字符串中的第一个数字。
4条答案
按热度按时间ipakzgxi1#
数字滤波和
sscanf()
的组合应该可以工作。溢出的数字需要额外的工作。
下面是一个较慢但迂腐的方法
kmbjn2e32#
scanf尝试匹配一个模式....所以如果你知道字符串是“他是16岁。”其中16是你想解码的整数。
(我认为您的输入字符串暗示了您的格式是某种自由形式,我假设它是可预测的。)
nhaq1z213#
对于初学者来说,您应该知道
strtok
函数也是相当古老的。它在C89标准中,但可能存在于之前的许多实现中(例如在1986年发布的4.3BSD中)。实际上,sscanf
函数可能比strtok
函数更新。但是,如果您使用的编译器非常古老,并且实际上没有
strtok
函数,那么您的输入字符串 and 就不会遵循您在问题中使用的格式,而是可以使用更自由的格式(因此无法真正使用sscanf
的模式匹配功能),那么您必须手动解析字符串。这种手动解析实际上非常简单,只需循环字符串直到找到一个数字,然后在构造数字时收集所有连续的数字。一旦得到一个非数字字符,就得到了数字。当然,这只会得到字符串中的第一个数字。
ddrv8njm4#