我有一个输入文件,其中包含以下行:
e 45
我需要一种将数字“ 45”设置为名为value的int变量的方法。 我已经尝试过
sscanf(inputfile, " %d", &value);
但值不变。 我使用的功能是否错误?
答案 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
仔细检查一下,如果还有其他问题,请告诉我。