C语言:如何通过sscanf从字符串中获取数字?

时间:2014-02-19 14:53:33

标签: c string numbers output scanf

最近我需要从一个字符串中提取一个数字,但是在真正的旧C上,不支持像strtok这样的函数。我更喜欢sscanf,但我无法理解。 请注意,整数是随机位置(用户定义)。

一般来说,这就是我想要的一个例子:

Input:
char * string = "He is 16 years old.";

Output:
16

4 个答案:

答案 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;
}