C语言结构体赋值的问题,刚输入第一个name就提示出错
发布网友
发布时间:2022-04-23 12:51
我来回答
共2个回答
热心网友
时间:2023-09-20 06:42
这里有两个问题需要注意:首先是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);
此时便可得到你想要的结果。
热心网友
时间:2023-09-20 06:43
亲,输入字符串前面不加取地址符&,其他都加取地址符&,你刚好给整反了追问谢谢我改过来了,但是我刚刚输入name就弹出了sex?age?
追答由于系统输入缓冲区的问题,你在scanf ("%c", &stu.sex);这句之前或者scanf ("%s", stu.name);这句之后加一个getchar();获得一个回车符,或者fflush(stdin);清空缓冲区就可以了。