printf()在while循环中的奇怪行为

时间:2011-12-04 02:20:16

标签: c while-loop printf getchar

有人可以解释一下为什么我看到printf()函数的双输入是while循环:

#include <ctype.h>
#include <stdio.h>

int main(){
    int x = 0;

    while ( x != 'q'){

    printf("\nEnter a letter:");

    x=getchar();
    printf("%c\n", x);
    if( isalpha(x) )
      printf( "You entered a letter of the alphabet\n" );
    if( isdigit(x) )
      printf( "You entered the digit %c\n", x);
    }   
    return 0;
}

Debian Squeeze中的代码输出(gcc版本4.4.5(Debian 4.4.5-8))是:

Enter a letter:1
1
You entered the digit 1

Enter a letter: // why is the first one appearing ???


Enter a letter:2
2
You entered the digit 2

4 个答案:

答案 0 :(得分:5)

第一个读取在1之后按Enter键时输入的行终止符字符(行结束符将保留在输入缓冲区中)。

您可以通过添加else分支来验证这一点:

#include <ctype.h>
#include <stdio.h>

int main()
{
  int x = 0;
  while ( x != 'q')
  {
    printf("\nEnter a letter:");
    x = getchar();
    printf("%c\n", x);
    if( isalpha(x) )
      printf( "You entered a letter of the alphabet\n" );
    else if( isdigit(x) )
      printf( "You entered the digit %c\n", x);
    else
      printf("Neither letter, nor digit: %02X\n", x);
  }
  return 0;
}

输出:

Enter a letter:1
1
You entered the digit 1

Enter a letter:

Neither letter, nor digit: 0A

Enter a letter:2

字节0A是换行符。

答案 1 :(得分:1)

第二次循环,getchar()在您输入的第一个字符后获得 Enter

您可以执行类似

的操作
while ((c = getchar()) != EOF && c != '\n') {} /* eat the rest of the line */

在获得一个字符后,在要求另一个字符之前,删除所有内容,包括下一个 Enter

答案 2 :(得分:0)

如果要在输入稍微高级的技术时检查字符,则将stdin的行为更改为原始模式。然后,一旦用户点击字符,您就可以在变量中获得该字符。 Check this for some start

答案 3 :(得分:0)

使用CTRL + D获取换行符的功能而不会产生副作用。