getchar()和缓冲区顺序

时间:2015-08-03 16:07:50

标签: c getchar

我正在阅读的初学者的C书让我对getchar()和缓冲区顺序感到困惑(特别是因为它与换行有关)。它说,

  

摆脱Enter按键是所有C程序员必须面对的问题。考虑以下计划部分:

printf("What are your two initials?\n");
firstInit = getchar();
lastInit = getchar();
  

如果用户输入GT,您会认为G会进入变量firstInitT会进入lastInit,但是那不是发生了什么。在用户按Enter键之前,第一个getchar()没有完成,因为G正在进入缓冲区。只有当用户按下Enter时,G才会离开缓冲区并转到程序 - 但是然后缓冲区上的Enter 仍然!因此,第二个getchar()将Enter(\n)发送给lastInitT仍然留给后续的getchar()(如果有的话)。

首先,我不理解作者关于为什么\n转到lastInit而不是T的解释。我猜是因为我将缓冲区可视化为“先出先出”。无论哪种方式,我都不理解作者所呈现的顺序背后的逻辑 - 如果用户输入G,然后T,然后输入,那么G是如何被getchar()捕获的第一个getchar(),输入(换行符)由第二个T捕获,getchar()由第三个G捕获?令人费解。

其次,我自己尝试了这个(Ubuntu 14.04在Windows 8.1下运行VMWare,文本编辑器Code :: Blocks,编译器gcc),我得到了作者所说的没有的确切常识结果< / em>发生!:firstInit转到TlastInit转到#include <stdio.h> main() { char firstInit; char lastInit; printf("What are your two initials?\n"); firstInit = getchar(); lastInit = getchar(); printf("Your first initial is '%c' and ", firstInit); printf("your last initial is '%c'.", lastInit); return 0; } 。这是我的代码:

What are your two initials?

输出是:

GT
Your first initial is 'G' and your last initial is 'T'.
main() { char firstInit; char lastInit; int newline; printf("What are your two initials?\n"); firstInit = getchar(); lastInit = getchar(); newline = getchar(); printf("Your first initial is '%c' and ", firstInit); printf("your last initial is '%c'.", lastInit); printf("\nNewline, ASCII %d, comes next.", newline); return 0; }

我还创建了一个后续程序,它似乎证实了换行符最后出现在缓冲区中:

What are your two initials?

输出是:

GT
Your first initial is 'G' and your last initial is 'T'.
Newline, ASCII 10, comes next.
{{1}}

我在这里错过了什么或作者是错的? (或者这是依赖于编译器的 - 尽管作者没有这么说)?

Book: C Programming Absolute Beginner's Guide ,3rd edition,Greg Perry,©2014,Ubuntu 14.04,gcc compiler version 4.8.4

2 个答案:

答案 0 :(得分:3)

作者描述了用户输入“G&lt; enter&gt; T&lt; enter&gt;”的情况。

答案 1 :(得分:2)

这是一个不同的例子。对于每个输入的1,2或3选项,菜单循环将迭代两次 从//中删除注释//while ( ( getchar ( ) != '\n')) {},每次输入后缓冲区将被清除,菜单每个条目只会循​​环一次。

#include <stdio.h>

int main()
{
    char *menu[] = { "1. first", "2. second", "3. third", "4. Exit"};
    int choice = 0;
    int each = 0;

    do {
        for ( each = 0; each < 4; each++) {
            printf ( "%s\n", menu[each]);
        }
        printf ( "\tenter choice 1-4\n");
        choice = getchar ( );
        //clear the buffer
        //while ( ( getchar ( ) != '\n')) {}
        printf ( "you entered %d %c\n", choice, choice);
    } while ( choice != '4');
    return 0;
}