关于gets的一个小问题

来源:百度知道 编辑:UC知道 时间:2024/06/26 03:29:42
分别输入学生的学号,姓名,性别,年龄和地址,然后输出。
我不明白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()。

main函数中的printf("name:");后不需加getchar();
那当然~~你都说是输入name~~你name是1个数组
如果你加getchar就当你输入一个字符如果你输入多个就会接着gets(p->name)
这种题太简单了真受不了~~如果这种简单的东东都不懂~你到WINDOWS编程你就完蛋了~建一个窗口都要1百行代码

我不明白main函数中的printf("name:");后不需加getchar();
加了后就会显示不了接着输入姓名的第一个字母。
关于这个,因为getchar()要输入一个字符才会执行下面的代码,
于是你名字的第一个字符被getchar()占用掉了,所以只有剩下
的字符串被存在name里了。
第二个疑问可能是gets函数并不等待吧。

gets(p->number);
我不明白main函数中的printf("name:");后不需加getchar();
这里