我正在阅读有关将输入文件重定向到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中已存在的垃圾值?
答案 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总是为零。