【发布时间】:2014-09-29 12:34:02
【问题描述】:
我正在阅读有关将输入文件重定向到 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 中的垃圾值吗?
【问题讨论】:
-
总是检查scanf的返回值,它会告诉你转换是如何进行的。至于第二个问题;零是垃圾值。
-
你的主要应该是:
int main (int argc, char *argv[]) -
我使用另一个变量来存储scanf的返回值并打印它,它打印0。这是否意味着没有扫描任何东西,因此它返回NULL?
-
糟糕,我的意思是它打印出 -1,而不是 0,我意识到这是 EOF 字符,正如 @Yamakuzure 从手册页中解释的那样。
-
如果您运行
./a.out并直接按 ctrl+d 结束标准输入,您将获得相同的行为。