C语言结构体赋值的问题,刚输入第一个name就提示出错

#include<stdio.h>
#define PR printf
struct student
{
char name[20];
char sex;
int age;
float score;
}stu;
#include<string.h>
int main()
{
PR("name?");scanf("%s",&stu.name);
PR("sex?");scanf("%c",stu.sex);
PR("age?");scanf("%d",stu.age);
PR("score?");scanf("%f",stu.score);
PR("name:%s\n",stu.name);
PR("sex:%c\n",stu.sex);
PR("age:%d\n",stu.age);
PR("score:%f\n",stu.score);
return 0;
}

这里有两个问题需要注意:首先是stu.name是数组,因此赋值时不必再取地址,因为数组名就是首地址;同样,stu.sex,stu.age,stu.score是变量,所以需要去地址;因此代码应该为:

PR("name?");scanf("%s",stu.name);
PR("sex?");scanf("%c",&stu.sex);
PR("age?");scanf("%d",&stu.age);
PR("score?");scanf("%f",&stu.score);
但这时候编译执行,你会发现输入完name以后,没有让你输入sex,便直接让输入age了,这个问题原因为:
scanf是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式会接收回车字符,在输入第一个scanf时输入一串字符后按 回车结束,输入缓冲中保存了这个回车符,遇到第二个scanf时,它自动把这个回车符赋给了ch2。所以相当于已经执行了scanf("%c",&stu.sex);输入的值是回车;而如果第二个scanf的输入格式不是%c时,由于格 式不匹配,这个回车符会被自动忽略;
解决办法:
1。清空输入缓冲区
第一个scanf后加入清空输入缓冲区函数:fflush(stdin);
代码变为:
PR("name?\n"); scanf("%s",stu.name);fflush(stdin);
PR("sex?\n"); scanf("%c",&stu.sex);
PR("age?\n"); scanf("%d",&stu.age);
PR("score?\n"); scanf("%f",&stu.score);
2。格式控制中加入空格
将第二个scanf改为:scanf(" %c",&stu.age);//在%号前面加一个空格,此时由于与回车不匹配秒就把回车忽略了
代码变为:
PR("name?\n"); scanf("%s",stu.name);
PR("sex?\n"); scanf(" %c",&stu.sex);
PR("age?\n"); scanf("%d",&stu.age);
PR("score?\n"); scanf("%f",&stu.score);
此时便可得到你想要的结果。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-05-18
亲,输入字符串前面不加取地址符&,其他都加取地址符&,你刚好给整反了追问

谢谢我改过来了,但是我刚刚输入name就弹出了sex?age?

追答

由于系统输入缓冲区的问题,你在scanf ("%c", &stu.sex);这句之前或者scanf ("%s", stu.name);这句之后加一个getchar();获得一个回车符,或者fflush(stdin);清空缓冲区就可以了。

相似回答