#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中工作,但在这里不行……
发布于 2012-08-11 02:42:10
通过一些小的研究,我猜问题出在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课程中遇到了一个主要的问题,那就是gets() ( DevC++)是作为一个编译器被建议使用的。然而,我完全记得我没有听从建议,事实证明fgets()的行为也依赖于编译器。
gets()的手册页包含以下内容:
错误
永远不要使用get()。因为在事先不知道数据的情况下不可能知道get()将读取多少字符,而且get()将在缓冲区结束后继续存储字符,所以使用它是非常危险的。它已经被用来破坏计算机的安全。改用fgets()。
发布于 2012-08-11 03:57:36
Scanf或其他输入解析函数仅采用从标准输入的调用中指定的所需数量的字符,并拒绝others.As这些被拒绝的值,在下一次读取标准输入期间,这些被拒绝的值与换行符一起进入变量,从而跳过几次输入。更好的做法是调用清除标准输入的清除例程,并停止垃圾进入其他变量。
尽管你的代码很容易受到攻击,但它还是有解决方案的:
#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();
}发布于 2012-08-11 02:41:53
当您键入42 (或其他任何值)作为第一个整数时,实际上键入了三个字符:4、2,然后是按ENTER键后的换行符。第一个scanf读取一个整数,这意味着它只读取4和2,并将换行符留在输入缓冲区中。
当您的程序到达 gets 时,它会读取只包含换行符的非常短的行。
您可以通过在scanf之后读取并丢弃换行符来修复它,如下所示:
printf("\nEnter Integer : ");
scanf("%d",&i);
while (getchar() != '\n')
;https://stackoverflow.com/questions/11907102
复制相似问题