为什么我必须再调用`getchar()`

时间:2014-10-22 10:43:15

标签: c

/* C89 */
#include<stdio.h>
int main(void){
    int c;  
    printf("Print any not EOF char: ");
    c = getchar(); /* I put a char and press 
                   the ENTER key here.*/
    printf("int value: %d\n", c);   
    printf("Now print the EOF char \n(Ctrl + Z for Windows, " 
        "or Ctrl + D for Linux): ");    
    c = getchar(); 
    EOF == c ? printf("You did it! int value: %d\n", c) : 
        printf("It is not EOF char!\n");
    return 0;
}

当我按下&#39; a&#39;键,然后按ENTER,我得到这个: 输出:

  

打印任何非EOF字符:int值:97现在打印EOF字符(Ctrl +   Z for Windows,或Ctrl + D for Linux):它不是EOF char!

因此,在第二次调用getchar()时,我没有问过char。为什么呢?

如果我按下&#39; a&#39; char和CTRL + Z(我使用Windows操作系统),我得到这个: 输出:

  

打印任何非EOF字符:a ^ Z int值:97现在打印EOF字符(Ctrl   + Z for Windows,或Ctrl + D for Linux):它不是EOF char!

但是Ctrl + Z是Windows操作系统的EOF。为什么会这样?

如果我修改我的代码:

/* C89 */
#include<stdio.h>
int main(void){
    int c;  
    printf("Print any not EOF char: ");
    c = getchar(); /* I put a char and press 
                   the ENTER key here.*/
    printf("int value: %d\n", c);   
    printf("Now print the EOF char \n(Ctrl + Z for Windows, " 
        "or Ctrl + D for Linux): ");
    getchar(); /* Ignore the ENTER key pressed before. */
    c = getchar(); /* Now I can to ask next char. */
    EOF == c ? printf("You did it! int value: %d\n", c) : 
        printf("It is not EOF char!\n");
    return 0;
}

现在输出是我的预期: 输出:

  

打印任何非EOF字符:int值:97现在打印EOF字符(Ctrl +   Z for Windows,或Ctrl + D for Linux):^ Z你做到了! int值:-1

为什么会这样?即为什么我必须再拨打getchar()

1 个答案:

答案 0 :(得分:0)

按Enter键可以做两件事:在输入缓冲区的末尾添加一个NewLine字符(ASCII NL,代码10),然后将其刷新,使整个行可用于getchar()。因此,在按下“a”之后,您还需要按Enter键,以便您的程序可以查看和解释“a”。但是,您必须使用其他getchar()来跳过输入流中的NL字符。

然而,当您知道下一个请求是什么时,您可以按'a'(输入'a'),CTRL + Z(输入EOF字符)然后按Enter(输入NL并发送3个字符进行处理) - 然后两个字符'a'和EOF可以由两个getchar s读取。