我有一个简单的文件如下:
1
3
a 7
当我运行下面的代码时,我得到了一些意想不到的结果。我最初尝试读取前两个整数,然后读取字符a
和数字7
。数字1
或3
之后没有空格。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main(int argc, char **argv)
{
FILE *f;
f = fopen(argv[1],"r");
int num1, num2, num3;
char t;
fscanf(f, "%d",&num1);
fscanf(f, "%d",&num2);
fscanf(f, "%c %d", &t, &num3);
printf("%c %d\n", t, num3);
}
编辑:
输入是包含内容的文件:
1
3
a 7
并且输出是一个新行和一些垃圾。预期输出应为a 7
编辑2:它正确读取1和3.然后尝试读取单个字符a
如果失败
答案 0 :(得分:2)
了解运行此操作时会发生什么:
fscanf(f, "%d",&num1);
跳过空白(其中没有空格),然后读取整数(1)
fscanf(f, "%d",&num2);
跳过空格(第一行末尾的换行符)然后读取一个整数(3)
fscanf(f, "%c %d", &t, &num3);
从输入(换行符)读取下一个caharcter,然后跳过空格(无)并尝试读取整数。下一个输入字符为“a
”,因此失败,fscanf
调用返回1而不向num3写入任何内容。
所以你遇到的问题是,由于%c
NOT 跳过空格这一事实,你正在读取空格(换行符)而不是你期望的字符。最明显的解决方案是在格式中添加一个空格()以跳过空格:
fscanf(f, " %c%d", &t, &num3);
请注意,我还删除了%d
之前的空格,因为它是多余的(%d
总是跳过空格)。
此外,最好检查fscanf
的返回值,以确保它正在读取您期望的输入项目数。