scanf无法检测到EOF但是getchar能够检测到EOF输入吗?

时间:2016-12-08 13:20:29

标签: c scanf eof getchar

我只是想知道为什么我的代码没有注册我的 CTRL + Z 输入?当我输入 CTRL + Z 时,它不会以某种方式退出while循环。

然而,当我用scanf()函数替换getchar()函数时,它突然起作用了!有人可以帮助我这个吗?

#include <stdio.h>
#include <stdlib.h>

int main(){
    char grade;
    while( grade != EOF){
        scanf("%c" , &grade);
        switch(grade){
        case 'a':
            printf("you got an a!\n");
            break;
        case 'b':
            printf("you got a b!\n");
            break;
        case'\n':
            break;
        default:
            printf("error :(\n");
            break;
        }
    }
    printf("Hello world!\n");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您需要检查scanf()函数的返回值以获取预期 EOF。在扫描失败后检查EOF的参数是错误的,如果参数类型为自动本地且未初始化,则可以调用undefined behavior

引自man page强调我的

  

如果在第一次成功转换或匹配失败发生之前到达输入结尾,则返回值EOF 。如果发生读取错误,也会返回EOF,在这种情况下,将设置流的错误指示符(请参阅ferror(3)),并设置errno表示错误。

也就是说,char不足以保存EOF的值,如果您必须存储scanf()来电的返回值,请使用int