1

我想在 C 中打印 EOF 的值。

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

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

尽管。

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

错误地打印 126 。

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

4

4 回答 4

2

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

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


编辑:仔细检查手册页,返回值应该是EOF. 请注意,这是返回值,而不是写入ch.

于 2012-12-07T17:38:53.280 回答
1

是什么让你想到 scanf 会用 EOF 填充字符参数?

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

于 2012-12-07T17:38:00.940 回答
1

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

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

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

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

于 2012-12-07T17:38:15.223 回答
1

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

于 2012-12-07T17:39:37.077 回答