关于gets的一个小问题

分别输入学生的学号,姓名,性别,年龄和地址,然后输出。
我不明白main函数中的printf("name:");后不需加getchar();
加了后就会显示不了接着输入姓名的第一个字母。而后面printf("add:");就要加getchar()才能正确显示。
#include<stdio.h>
struct student
{ char number[20];
char name[20];
char sex;
int age;
char add[50];
}stu[2];
void main()
{

struct student *p;
p=stu;
for(;p<=stu+1;p++)
{
printf("number:");
gets(p->number);
printf("name:");
//getchar();
gets(p->name);
printf("sex:");
scanf("%c",&p->sex);
printf("age:");
scanf("%d",&p->age);
printf("add:");
getchar();
gets(p->add);

}

p=stu;
for(;p<=stu+1;p++)
{
printf("%s,%s,%c,%d,%-50s\n",p->number,p->name,p->sex,p->age,p->add);
}

这个是ANSI C输入库函数设计混乱造成的:不同的函数,如scanf(),gets()对输入缓冲区的回车换行符的处理不同。
那个getchar()放在那里才能使程序运行正常正是用来接收输入age后的那个回车符,否则程序直接跳到第二个stu的初始化;但是第一个地方为什么不能用getchar(),除了以上孩子说的原因,可能就是库函数设计的因素了:字符串和字符串之间用gets()貌似可以正常处理回车,而整形和字符串之间对gets()却不行.
你也可以这样:在每个scanf()或者gets()之前用fflush(stdin)代替getchar()清空字符缓冲区,这样就都一致了。也就是说这里的getchar()是用作fflush()的。
C的输入混乱还可以从这里看出来:如果你将你源程序的getchar();
gets(p->add);这两句改成scanf("%s",p->add);一句,那么输入age和add不会出现之前的问题,但是又必须在scanf()之后清空字符缓冲区,因为紧接着的是gets()。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-09-23
main函数中的printf("name:");后不需加getchar();
那当然~~你都说是输入name~~你name是1个数组
如果你加getchar就当你输入一个字符如果你输入多个就会接着gets(p->name)
这种题太简单了真受不了~~如果这种简单的东东都不懂~你到WINDOWS编程你就完蛋了~建一个窗口都要1百行代码
第2个回答  2008-09-23
我不明白main函数中的printf("name:");后不需加getchar();
加了后就会显示不了接着输入姓名的第一个字母。
关于这个,因为getchar()要输入一个字符才会执行下面的代码,
于是你名字的第一个字符被getchar()占用掉了,所以只有剩下
的字符串被存在name里了。
第二个疑问可能是gets函数并不等待吧。
第3个回答  2008-09-24
gets(p->number);
我不明白main函数中的printf("name:");后不需加getchar();
这里本身来说是因为gets函数的作用结果,gets是当你按enter键结束输入字符串;所以不需加getchar();这里说明一下,getchar()是c里面本身的已经定义了的一个函数,作用就是接受输入的字符,就是等你随便敲入一个字符才执行下一步。
而后面printf("add:");就要加getchar()才能正确显示。
这里是因为C语言的让你在屏幕看到结果的一种方法,要知道,计算机运行的速度非常快的,它要显示什么一下子就过去了,你无法看到结果,所以为了方便你看到结果才加入getchar();的,不加如完全是对的,只是你看不到结果,系统将马上就关闭了程序,你用的大概是C++3.0吧,这个里面加的就是getchar();
有点C编译器里加的是getch();

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网