解析一行以在C中同时接受字符和两位数字

时间:2018-11-30 04:15:53

标签: c parsing

我有一个输入文件,其中包含以下行:

  

e 45

我需要一种将数字“ 45”设置为名为value的int变量的方法。 我已经尝试过

sscanf(inputfile, " %d", &value);

但值不变。 我使用的功能是否错误?

1 个答案:

答案 0 :(得分:4)

您的使用:

sscanf(inputfile, " %d", &value);

有两点是错误的。首先sscanf不会从文件流中读取文件(大概是inputfile所指),而sscanf的原型是:

int sscanf(const char *str, const char *format, ...);

第一个参数是const char *,它从缓冲区解析信息(您很可能会填充对fgets的调用以从文件中读取信息)

其次,用字符串"e 45"尝试用" %d"解析会导致匹配失败,因为当"%d"转换说明符遇到非数字字符时, ,转换失败,从输入缓冲区提取字符的操作停止,调用失败。

相反,在尝试使用"45"进行解析之前,您需要删除"%d"之前的所有非数字字符。您可以使用带'*'的否定的 character class 赋值抑制运算符(例如" %*[^0-9]%d")来执行此操作,从而导致sscanf跳过前导空格(不需要),并且将读取和丢弃所有非数字(用' '跳过前导空格)和"%*[^0-9]"({{1 }}抑扬符会否定'^'中字符的匹配,然后最终用"[...]"解析整数值。

一个简短的例子是:

"%d"

注意:始终始终检查任何#include <stdio.h> int main (void) { char *s = "e 45"; int n; if (sscanf (s, " %*[^0-9]%d", &n) != 1) { fputs ("error: invalid format.\n", stderr); return 1; } printf ("n: %d\n", n); return 0; } 函数的返回)

使用/输出示例

scanf

仔细检查一下,如果还有其他问题,请告诉我。