我正在阅读的初学者的C书让我对getchar()和缓冲区顺序感到困惑(特别是因为它与换行有关)。它说,
摆脱Enter按键是所有C程序员必须面对的问题。考虑以下计划部分:
printf("What are your two initials?\n");
firstInit = getchar();
lastInit = getchar();
如果用户输入
GT
,您会认为G
会进入变量firstInit
而T
会进入lastInit
,但是那不是发生了什么。在用户按Enter键之前,第一个getchar()
没有完成,因为G
正在进入缓冲区。只有当用户按下Enter时,G
才会离开缓冲区并转到程序 - 但是然后缓冲区上的Enter 仍然!因此,第二个getchar()
将Enter(\n
)发送给lastInit
。T
仍然留给后续的getchar()
(如果有的话)。
首先,我不理解作者关于为什么\n
转到lastInit
而不是T
的解释。我猜是因为我将缓冲区可视化为“先出先出”。无论哪种方式,我都不理解作者所呈现的顺序背后的逻辑 - 如果用户输入G
,然后T
,然后输入,那么G
是如何被getchar()
捕获的第一个getchar()
,输入(换行符)由第二个T
捕获,getchar()
由第三个G
捕获?令人费解。
其次,我自己尝试了这个(Ubuntu 14.04在Windows 8.1下运行VMWare,文本编辑器Code :: Blocks,编译器gcc),我得到了作者所说的没有的确切常识结果< / em>发生!:firstInit
转到T
,lastInit
转到#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
答案 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;
}