C语言中关于gets与scanf的问题(有例)

来源:百度知道 编辑:UC知道 时间:2024/06/04 13:49:23
题目要求:用函数实现输入输出3个学生的学号,姓名,3门课程成绩。
附:用结构体。
这里我采用gets输入姓名,用puts输出姓名。用scanf输入学号。但是若我把scanf放在前面,把gets放在后面,则输入学号敲回车后,直接跳到输入成绩,把输入姓名越过去了。但把scanf和gets调换一下则正常输入。请高手解释一下原因!
另外,我想用gets和puts处理字符数组,但是它们都自动换行,使得最后制表不美观,请问在用gets和puts的前提下如何解决此问题?
(说明:在制表部分,我没有具体计算各数据输出位置。)

#include<stdio.h>
#include<string.h>
#define N 3
struct student
{int num;
char name[10];
float score[3];
}stu[N];

void main()
{void input();
void print();
input();
print();
}

void input()
{struct student *p;
int i,j;
p=stu;
for(i=0;i<N;i++,p++)
{printf("请输入第%d个学生的信息:\n",i+1);
printf(" 姓名:");
gets(p->name);
printf(" 学号:");
scanf("%d",&p->num);
printf("\n");
for(j=0;j<3;j++)
{printf(" 成绩%d:",j+1);
scanf("%

在scanf后面加一个getchar();
意思就是清理缓存中的'\n'
不知道这样你能不能明白
你用scanf 接受侯有一个回车
用 getchar()把它清理掉
不然gets就直接接受'\n'
以输入数据错误而跳过了(不处理)

用 while(getchar()!='\n');就是让getchar吞掉scanf缓存中的字符,直到输入一个回车符为止。
你要知道scanf的运行机制,scanf扫描的时候,先把字符放在缓冲区,等待用户按回车后将缓存的内容传送到程序,如果你是 %d 而你却输入了一个字母, 这个时候 scanf不会跳过字符,会反复把你输入的字符传给%d,而%d不允许接受字符,所以程序一直这么循环,导致你不想要的结果。
一般加while(getchar()!='\n');的结果就是让getchar吞掉非法输入的字符,直到换行符为止,这个在 c primer plus 里面有详细的解释,
如果还不明白,加qq:176590666给你详细解释

http://baike.baidu.com/view/1457521.htm 介绍gets()
http://baike.baidu.com/view/1390039.htm 介绍scanf()

用getchar();吸收回车符