while循环在使用getchar()和putchar()时打印相同的语句两次

时间:2017-02-12 12:44:42

标签: c

我正在编写一个简单的代码,它从用户那里获取一个字符并打印出来,如果字符是q,那么循环就会中断。但我得到的输出打印两次打印声明,第二次打印没什么请看图像。为什么打印两次?

#include<stdio.h>
void main()
{
  char c;
  printf("Enter a character: ");
  c=getchar();
  while(c!='q')
  {
     putchar(c);
     printf("\nEnter a character: ");
     c=getchar();
  } 
}

2 个答案:

答案 0 :(得分:3)

您正在按返回 / Enter 键作为输入的一部分。它保留在输入流中,并在下一次迭代中立即被getchar选中。

如果格式化输入是一个选项,您可以在等待字符输入时使用scanf跳过空格字符:

scanf(" %c", &c); // Note the leading white-space, it's what does the skipping

如果您继续使用getchar,请注意其返回类型,即int。当输入流耗尽时,它返回EOF,并且该值不是有效字符,而是整数。

答案 1 :(得分:2)

什么是缓冲? 临时存储区域称为缓冲区。所有标准输入和输出设备都包含输入和输出缓冲区。在标准C / C ++中,流被缓冲,例如在标准输入的情况下,当我们按下键盘上的键时,它不会发送到您的程序,而是由操作系统缓冲,直到时间被分配给程序

键入“while((getchar())!='\ n');”读取缓冲区字符直到结尾并丢弃它们(包括换行符)并使用它清除输入缓冲区并允许输入所需的容器

以下代码可以正常使用:

#include<stdlib.h>
void main()
{
    char c;
    printf("Enter a character: ");
    c = getchar();
    while(c != 'q')
    {
        putchar(c);
        // flushes the standard input (clears the input buffer)
        while ((getchar()) != '\n');
        printf("\nEnter a character:");
        c = getchar();
    }

}