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


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



首先,我不理解作者对\n为什么要变成lastInit而不是T的解释。我猜是因为我将缓冲区可视化为“先进先出”。无论哪种方式,我都不了解作者提出的命令背后的逻辑-如果用户输入GT,然后Enter,那么第一个G捕获getchar()的方式如何,Enter捕获(换行符)的方式是第二个getchar(),第三个T捕获了getchar()?令人费解。

其次,我自己尝试了一下(Ubuntu 14.04在Windows 8.1下的VMWare上运行,文本编辑器Code::Blocks,编译器gcc),我得到了笔者认为没有发生的确切常识结果!:G转到firstInitT转到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?GTYour 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?GTYour first initial is 'G' and your last initial is 'T'.Newline, ASCII 10, comes next.
那么我在这里错过了什么吗,还是作者错了? (或者这是否依赖于编译器,即使作者没有这么说)?

书籍:《 C编程绝对入门指南》,第3版,Greg Perry,©2014,Ubuntu 14.04,gcc编译器版本4.8.4

最佳答案

作者正在描述用户键入“G T ”的情况。

关于c - getchar()和缓冲区顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31791938/

10-15 02:12