C程序:使用scanf从stdin读取字符时出错

目前我正在尝试学习简单的C程序。 但是,我遇到了这种情况:

#include #include void main() { char c; int tryagain=1; while(tryagain>0){ printf("Enter the Character : "); scanf("%c",&c); printf("You entered the character \"%c\" and the ascii value is %d",c,c); getch(); clrscr(); tryagain=0; printf("You want to Trry again Press 1 : "); scanf("%d",&tryagain); clrscr(); } } 

用户首次输入角色时程序正常。 并且,当它要求继续时。 并且,用户输入1然后它表现为weired。 它会自动输入空白字符并打印ascii并转到同一个地方。

我怎么解决这个问题? 而且,特别是,为什么这样的原因?

而且,对不起我的英语很差!

先感谢您。

问题是您正在读取第二个scanf中的单个数字,但是用户输入的数字不止一个,用户也可以通过按下输入新的行字符。

用户输入“1 \ n”。 您的scanf读取“1”,在输入流中省略“\ n”。 然后,读取字符的下一个scanf从流中读取“\ n”。

这是更正后的代码。 我使用getc来丢弃那里的额外新行字符。

 #include  void main() { char c; int tryagain = 1; while (tryagain > 0) { printf("Enter a character: "); scanf("%c", &c); printf("You entered the character \"%c\" and the ascii value is %d\n", c, c); tryagain = 0; printf("If you want to try again, enter 1: "); scanf("%d", &tryagain); // get rid of the extra new line character getc(stdin); } } 

另外,作为旁注,你使用conio.h ,它不是标准C的一部分,它是MS-DOS头文件,因此它不是你正在写的便携式C. 我已将其从代码中删除,但您可能希望保留它。

当你使用

 scanf("%d",&tryagain); 

该数字被读入tryagain但新行字符'\n'仍留在输入流中。 下次使用时:

 scanf("%c",&c); 

换行符被读入c

通过使用

 scanf("%d%*c",&tryagain); 

从输入流中读取换行符,但不会将其存储在任何位置。 它被简单地丢弃了。