我有一个输入文件,其中包含以下行:
e 45
我需要一种方法将数字“45”设置为名为 value 的 int 变量。 我尝试过这样做
sscanf(inputfile, " %d", &value);
但值(value)没有改变。 我使用的功能错误吗?
最佳答案
您的使用:
sscanf(inputfile, " %d", &value);
有两点是错误的。首先,sscanf
不会从文件流中读取(大概是 inputfile
引用的),sscanf
的原型(prototype)是:
int sscanf(const char *str, const char *format, ...);
其中第一个参数是 const char * ,它解析缓冲区中的信息(您很可能会通过调用 fgets 来填充缓冲区以从文件中读取信息)
其次,对于字符串 "e 45"
,尝试使用 "%d"
进行解析会导致匹配失败,因为当"%d"
转换说明符遇到非数字,转换失败,从输入缓冲区提取字符停止并且调用失败。
相反,您需要先删除 "45"
之前的所有非数字字符,然后再尝试使用 "%d"
进行解析。您可以使用否定的字符类和赋值抑制运算符(例如'*'
)和"%*[^ 0-9]%d"
这会导致 sscanf
跳过前导空格(这是不需要的),并将读取并丢弃所有非数字(使得跳过前导空格带有多余的 ' '
)和 "%*[^0-9]"
('^'
抑扬符导致否定匹配 "[...]"
中的字符),最后用 "%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
函数的返回)
示例使用/输出
$ ./bin/sscanfn
n: 45
仔细检查一下,如果您还有其他问题,请告诉我。
关于c - 在 C 中解析一行以获取字符和两位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53551154/