将EOF作为C中的输入。

时间:2012-12-07 17:34:15

标签: c

我想在C中打印EOF的值。

char ch =getchar() ; 
printf("%d",ch) ; 

当我输入CTRL + Z(我在Windows中工作)时,这正确地打印了值-1。

虽然。

char ch ;
scanf("%c",&ch) ;
printf("%d",ch) ;

错误地打印126。

这种不寻常行为的原因是什么?

4 个答案:

答案 0 :(得分:2)

您尚未检查scanf的返回值。我敢打赌它是零:没有模式匹配。

值“126”是ch的未初始化值。


修改:仔细检查the man page后,返回值应为EOF。请注意,这是 return 值,而不是写入ch的值。

答案 1 :(得分:1)

是什么让你认为scanf会用EOF填充一个字符参数?

scanf函数命中了EOF,它无法进行转换并返回。 ch的值是声明变量时堆栈上的任何随机值。

答案 2 :(得分:1)

EOF旨在与正在读取的文件中包含的任何值区分开来。

因此,当您从文件中读取并可能收到EOF时,您使用char来保存该值。您应该使用int,并且仅在之后将结果转换为char ,您已经确认收到的内容而不是是EOF。要获得正确的结果,请尝试以下方法:

int char;
ch = getchar();
printf("%d", ch);

对于第二个示例,当您使用scanf读取数据时,您可以通过检查其返回值来查找读取的数据量(如果有)。如果它遇到文件的结尾,它将只是停止尝试转换输入,并且您将通过检查其返回值来找出成功转换的字段数。它不会尝试将EOF转换为变量。

答案 3 :(得分:1)

你应该检查scanf的返回码,它应该返回EOF。在这种情况下,您的char不受影响,因为未初始化可能是126