Dev-C ++输入被跳过

#include #include main() { int i; char c, text[30]; float f; printf("\nEnter Integer : "); scanf("%d",&i); printf("\nEnter Character : "); c = getch(); printf("\nEnter String:"); gets(text); printf("\nEnter Float:"); scanf("%f",&f); printf("\nInteger : %d",i); printf("\nCharacter : %c8",c); printf("\nString : %s",text); printf("\nFloat : %f",f); getch(); } 

为什么这个简单的程序无法使用gets()函数读取string ? 我还应该用什么来纠正它? 好吧,它在我的旧32位PC中的Turbo C中工作但不在这里……

Scanf或其他输入解析函数只接受stdin调用中指定的所需数量的字符并拒绝其他字符。因此,在下一次读取stdin期间,这些被拒绝的值与换行符一起输入变量,从而跳过输入很少调用。所以最好调用一个清除stdin的清除例程并阻止垃圾进入其他变量。

虽然您的代码非常容易受到影响,但仍有解决方案: –

 #include int clear() { while ((getchar())^'\n'); } int main() { int i; char c, text[30]={0}; float f; printf("\nEnter Integer : "); scanf(" %d",&i); printf("\nEnter Character : "); scanf(" %c",&c); printf("\nEnter String:"); clear(); gets(text); printf("\nEnter Float:"); scanf(" %f",&f); printf("\nInteger : %d",i); printf("\nCharacter : %c",c); printf("\nString : %s",text); printf("\nFloat : %f",f); getchar(); } 

通过一些小的研究,我猜想问题来自于scanf()scanf()读取一行没有行尾字符’\ n’,它似乎留在缓冲区中,实际上是下一个语句的红色。

或者您可以使用fgets( )和sscanf() ,如下所示:

要阅读我使用过的角色:

 fgets(text,sizeof(text),stdin); sscanf(text,"%c",&c); /* or: c = text[0]; */ 

读取我用过的整数

 fgets(text,sizeof(text),stdin); sscanf(text,"%d",&i); 

我在一个C课程中遇到了一个主要的问题(我将DevC ++建议用作编译器)。 但是,我完全记得我没有遵循建议,结果发现fgets()的行为也依赖于编译器。

gets()的手册页包含:

BUGS

永远不要使用gets()。 因为如果事先不知道数据就不可能分辨出get()会读取多少个字符,并且因为gets()将继续存储超过缓冲区末尾的字符,所以使用它是非常危险的。 它已被用来打破计算机安全。 请改用fgets()。

当您键入42 (或其他)作为第一个整数时,实际上键入三个字符: 4,2然后按ENTER键的换行符。 您的第一个scanf读取一个整数,这意味着它只读取42 ,将换行符留在输入缓冲区中。

当你的程序获得 ,它会读取一个非常短的行,该行只包含该换行符。

您可以通过在scanf之后阅读并丢弃换行符来修复它,如下所示:

 printf("\nEnter Integer : "); scanf("%d",&i); while (getchar() != '\n') ;