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

yxyvkwin  于 2023-02-03  发布在  其他
关注(0)|答案(4)|浏览(280)

最近我需要从一个字符串中提取一个数字,但是在非常老的C语言中,不支持像strtok这样的函数。我更喜欢sscanf,但是我不理解它。注意整数是随机的(用户定义的)。
总的来说,这就是我想发生的一个例子:

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

Output:
16
ipakzgxi

ipakzgxi1#

数字滤波和sscanf()的组合应该可以工作。

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; 
}
kmbjn2e3

kmbjn2e32#

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");
}
nhaq1z21

nhaq1z213#

对于初学者来说,您应该知道strtok函数也是相当古老的。它在C89标准中,但可能存在于之前的许多实现中(例如在1986年发布的4.3BSD中)。实际上,sscanf函数可能比strtok函数更新。
但是,如果您使用的编译器非常古老,并且实际上没有strtok函数,那么您的输入字符串 and 就不会遵循您在问题中使用的格式,而是可以使用更自由的格式(因此无法真正使用sscanf的模式匹配功能),那么您必须手动解析字符串。
这种手动解析实际上非常简单,只需循环字符串直到找到一个数字,然后在构造数字时收集所有连续的数字。一旦得到一个非数字字符,就得到了数字。当然,这只会得到字符串中的第一个数字。

ddrv8njm

ddrv8njm4#

#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;
}

相关问题