【问题标题】:scanf cannot detect EOF but getchar is able to detect EOF input?scanf 无法检测到 EOF 但 getchar 能够检测到 EOF 输入?
【发布时间】:2016-12-08 13:20:28
【问题描述】:

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

但是,当我用 getchar() 函数替换 scanf() 函数时,它突然起作用了!有没有人能帮我解释一下?

#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;
}

【问题讨论】:

  • 值得注意的是,Ctrl-Z 是 Windows 上的 EOF 字符。 UNIX / Linux / POSIX 系统都为此使用 Ctrl-D (AFAIK)。
  • 注意gradewhile( grade != EOF){第一次执行时没有初始化。
  • 开始 1) 值 EOF 是有符号整数,而不是字符。 2) 在调用scanf() 时始终检查返回值,而不是参数值,因为EOF 值不会放在参数中。 3)变量grade在被检查之前没有被初始化。 4) 强烈建议将while() 语句写成:while( EOF != scanf( "%c", &amp;grade ) ) 建议始终阅读/理解所调用的任何系统函数的手册页。

标签: c scanf eof getchar


【解决方案1】:

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

引用man page强调我的

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

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

【讨论】:

  • 哦,你的意思是我应该简单地将等级更改为整数变量吗?我试过了,但还是不行……
  • @JavierLam 不,检查scanf()函数调用的return值。
  • 对不起,我知道这是一个非常菜鸟的问题,但是我如何检查 scanf() 函数调用的返回值?:) 如果解释起来太麻烦,我会理解的!我不得不说我的编程基础相当不稳定,因为我还是新手
猜你喜欢
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 2021-12-22
  • 2017-01-17
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 2018-11-15
相关资源
最近更新 更多