我想在C中打印EOF的值。
char ch =getchar() ;
printf("%d",ch) ;
当我输入CTRL + Z(我在Windows中工作)时,这正确地打印了值-1。
虽然。
char ch ;
scanf("%c",&ch) ;
printf("%d",ch) ;
错误地打印126。
这种不寻常行为的原因是什么?
答案 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