将空文件重定向为C中的输入

时间:2014-09-29 12:34:02

标签: c io

我正在阅读有关将输入文件重定向到C程序的信息,并在尝试使用代码并使用空文件“inp”时遇到以下内容:

#include <stdio.h>
int main()
{
    int i=10;
    scanf("%d", &i);
    printf("%d", i);
    return 0;
}

输出:

$ ./a.out < inp
10

我无法理解为什么scanf()不会暂停程序读取输入,尽管重定向的文件是空的,它会跳到printf()函数。

此外,当我修改代码以包含未初始化的i:

#include <stdio.h>
int main()
{
    int i;
    scanf("%d", &i);
    printf("%d", i);
    return 0;
}

输出:

$ ./a.out < inp
0

它总是打印0,但是按照上面的行为,它是否应该打印未初始化的i中已存在的垃圾值?

1 个答案:

答案 0 :(得分:2)

scanf()在空输入时不会失败,但什么都不做。您可能需要按照此处所述检查返回值:

  

man fscanf

     

这些函数返回成功匹配和分配的输入项数,   在早期匹配的情况下,可以少于提供的数量,甚至为零   故障。

  The  value  EOF  is  returned if the end of input is reached before either the
  first successful conversion or a matching failure occurs.  EOF is also returned
  if a read error occurs, in which case the error indicator for the stream 
  (see ferror(3)) is set, and errno is set indicate the error.

关于未初始化的i:这是一个0的隐式初始化。有人称之为功能。

但是,如果您没有安装scanf(),您的编译器会警告您:

#include <stdio.h>
int main()
{
    int i, j;
    scanf("%d", &i);
    printf("%d / %d\n", i, j);
    return 0;
}

启用所有警告的编译:

$ cc -Wall -Wextra -Wpedantic test.c -o test
test.c: In function 'main':
test.c:6:11: warning: 'j' is used uninitialized in this function [-Wuninitialized]
     printf("%d / %d\n", i, j);
           ^

运行程序

 $ ./test < empty_file
0 / 0

你看,即使j打印出零。


我添加了另一个测试:

在scanf之后添加:

    int k = i;
    int l = j;

    printf("%d / %d\n", k, l);

结果:

 $ ./test < empty_file 
 1115201808 / 0

所以,当我浏览scanf时,j完全没有初始化 结果可以随意重现,k总是随机的,l总是为零。