【发布时间】:2014-09-15 23:57:58
【问题描述】:
除非我真的被卡住了,否则我通常不会在这里提问!我想知道是否有人可以解释为什么我的代码会打印出“5 47”。我明白为什么有 5,但不明白为什么有 47?例如,我查找了空格 (32) 的 ASCII 值,并尝试将第二个字母更改为 e、f、g,但输出保持“5 47”不变。
一般来说,当我使用fscanf(fp, "%d", &variablename) 时,fscanf 会跳过杂项字符吗?例如:在我的文件 test.txt 中,我有“5 hello 6 ben jerry\n”。我将如何扫描 5 和 6? fscanf(fp, "%d %d", &test1, &test2) 会在 5 和 6 中扫描,跳过“你好”这个词吗?
这是我用来测试输出的简单代码:
int main(int argc, char *argv[]) {
int blah, test;
FILE * fp;
fp = fopen(argv[1], "r");
fscanf(fp, "%d %d", &blah, &test);
printf("%d %d\n", blah, test);
return 0;
}
我正在使用的文件作为 argv[1] 内容:
5g
附: FILE *fp 是指向每个字符/数字的实际指针,它在扫描文件时是否用作占位符?这就是我们需要rewind(fp) 到达文件末尾的原因吗?
【问题讨论】:
-
您从未检查过
fscanf的结果,这会告诉您只有一个值被成功解析。由于您从未初始化test,它的值是不确定的,您的输出也应该是。fscanf()的行为方式可以阅读 here 或直接访问源代码并阅读 C 标准。 -
我很困惑。那么 fscanf 是否在 g 或空格中扫描到 test 中?它适用于'blah'......为什么它不适用于'test'?我看了那个页面,我还是不明白为什么。请详细说明。谢谢
-
我无法比 cppreference 的作者(他们是 C/C++ 社区中非常口语良好的成员)更好地描述它。该链接是关于
scanf系列函数如何工作的罗塞塔石碑,值得您花 5 分钟以上的时间。