为什么fscanf会读取垃圾值

时间:2015-11-27 20:02:10

标签: c

我有一个简单的文件如下:

1
3
a 7

当我运行下面的代码时,我得到了一些意想不到的结果。我最初尝试读取前两个整数,然后读取字符a和数字7。数字13之后没有空格。

#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如果失败

1 个答案:

答案 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的返回值,以确保它正在读取您期望的输入项目数。