[英]Dev-C++ Input skipped
#include<stdio.h>
#include<conio.h>
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()
。 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()。
Scanf或其他输入解析函数只接受来自stdin的调用中指定的所需数量的字符并拒绝其他字符。因此,在下一次读取stdin期间,这些被拒绝的值与换行符一起进入变量,从而跳过输入很少调用。所以最好调用一个清除stdin的清除例程并阻止垃圾进入其他变量。
虽然您的代码非常容易受到影响,但仍有解决方案: -
#include<stdio.h>
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();
}
当作为第一整数类型42(或其他),则实际键入三个字符:4,2,然后该来自按压ENTER换行符。 您的第一个scanf读取一个整数,这意味着它只读取4和2 ,将换行符留在输入缓冲区中。
当你的程序获得时 ,它会读取一个非常短的行,该行只包含该换行符。
您可以通过在scanf之后读取并丢弃换行符来修复它,如下所示:
printf("\nEnter Integer : ");
scanf("%d",&i);
while (getchar() != '\n')
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.