Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言:如何通过sscanf从字符串中获取数字?_C_String_Numbers_Output_Scanf - Fatal编程技术网

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

C语言:如何通过sscanf从字符串中获取数字?,c,string,numbers,output,scanf,C,String,Numbers,Output,Scanf,最近我需要从一个字符串中提取一个数字,但是在真正古老的C语言上,像strtok这样的函数是不受支持的。我更喜欢sscanf,但我听不懂。 请注意,整数位于随机位置(用户定义) 总的来说,我想举个例子: Input: char * string = "He is 16 years old."; Output: 16 scanf尝试匹配一个模式。。。。如果你知道字符串是“He is 16 year.”其中16是你想要解码的整数 (我认为您的输入字符串意味着您的格式在某种程度上是自由的。我假设它是

最近我需要从一个字符串中提取一个数字,但是在真正古老的C语言上,像
strtok
这样的函数是不受支持的。我更喜欢
sscanf
,但我听不懂。 请注意,整数位于随机位置(用户定义)

总的来说,我想举个例子:

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

Output:
16

scanf尝试匹配一个模式。。。。如果你知道字符串是“He is 16 year.”其中16是你想要解码的整数

(我认为您的输入字符串意味着您的格式在某种程度上是自由的。我假设它是可预测的。)


首先,您应该知道strtok的
函数也非常古老。它出现在C89标准中,但在此之前可能存在于许多实现中(例如1986年发布的4.3BSD)。实际上,
sscanf
函数可能比
strtok
函数更新

但是,如果您有一个非常古老的编译器,并且实际上没有
strtok
函数,并且您的输入字符串没有遵循问题中的确切格式,但是形式更加自由(因此无法真正使用
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 main(){
char*string=“他16岁了。”;
智力年龄;
如果(sscanf(字符串,%*[^0123456789]%d”,&age)==1)
printf(“%d\n”,年龄);
其他的
printf(“未找到”);
返回0;
}

大家好,欢迎来到stackoverflow.com。请花些时间阅读,特别是命名和。更重要的是,请阅读。您可能还想了解a是什么。“但在真正古老的C上”-您是受虐狂吗?游戏编辑器平台不支持更新版本的C^^。我的哀悼。好吧,只要它不是一个核心语言特性,您就可以使用缺少的部分的现有实现。使用
sscanf
这是您可以得到的最生动的部分(OP)。如果您要获取一些其他非标准输入,那么除了“He is x year.”,
sscanf
之外的任何东西都不会这样做。给出的字符串类似于示例。基本上,用户只需在其中某个地方写入带有整数的随机字符串。。函数必须输出这些整数。有可能吗。。我只是看到了与
sscanf
类似的问题作为答案,但没有解释如何使用
sscanf
。通常输入字符串符合一些约定的语法。如果它是完全自由形式的,那么我将编写一个例程,将输入字符串在空白处拆分为一个较小字符串数组。然后在每个阵列上单步执行调用scanf的数组。Params值返回在我们的示例中有多少%d in-out示例被解码为int(最大值为1)。编译器甚至更古老<代码>strtok
不受支持,连上帝也不知道为什么。您的意思是转换数组中的字符串并设置比较,如果第一个字符是0-10,则返回它。。如果不跳到下一个?@Lively哦,天哪,我真的为你感到难过!但是,是的,这就是要点。呵呵@Joachim,我得习惯这样做。似乎我将自己创建一个比较输入输出函数。谢谢。事实上,我一直在尝试继续并最终使str-to-int函数:
int-stroint(char-source[]){int-multiplier=1;int-i,result;for(i=strlen(source)-1;i>=0;i--){if(source[i]>='0'&&source[i]@Lively可以向前走。
{size\u-ti;int-result=0;for(i=0;source[i];i++{if(source i]>='0'&&source[i]@JasonC
isdigit(*str)
是UB,当
*str<0
(*str>='0'&&str@JasonC通过
'9'
'0'
指定为顺序,因此
(*str>='0'&&str@JasonC参考:“在源和执行基本字符集中,上述十进制数字列表中0后的每个字符的值应比前一个字符的值大一个。”C17dr§5.2.1 3当
string
以am
int
开头时,如“123abc”,则不允许出现角位。
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; 
}
#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;
}