有人可以解释一下为什么我看到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
答案 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
获取换行符的功能而不会产生副作用。