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);清空缓冲区就可以了。

C语言为结构体中成员赋值出错是怎么回事
printf("%ld\\n%s\\n%f\\n%f\\n%f\\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);printf("\\n");}

c语言 结构体(struct)数据录入为什么失败
因为scanf("%d %d %d",&stu_first.birthday.year,&stu_first.birthday.month,&stu_first.birthday.day);当用户输入数据再输入了回车既是输入了\\n,所以当运行到while((*ptr++=getchar())!='\\n');就相当输入了空字符 你可以在scanf函数后再加个getchar();就能正确的跑了。

c语言结构体赋值错误,求改正,错误如下图,两次赋值其中一次为空值,没...
p指针在循环输入的时候没有跳转地址,所以两次赋值都是针对的stu[0]p++;\/\/放到循环里面

c语言,给结构体变量赋值的时候出现的问题。运行此程序之后会“停止工...
stu0[5].stu.name,&stu0[5].stu.num,&stu0[5].stu.shengri.year,&stu0[5].stu.shengri.month,&stu0[5].stu.shengri.day, \/\/***\/\/ &stu0[5].stu.high,&stu0[5].stu.weight);

C语言结构体成员指针初始化问题
问题:(一)中的student.name并未初始化,为什么能赋值成功?stu.name = "jim"; "jim"; 是字符串常量,系统自动为他分配了内存并保存这些字符,执行赋值操作是,将这个字符串的首地址复制给 stu.name。(二)偶用strcpy_s函数时有疑问,strcpty(str1,int,str2)中 sizeof(str1)>int&&in...

关于C语言结构体的问题。为什么返回一直错误?代码如下。
函数范围一个结构体对象Load;但是你的返回的load的类型是Load load[];是一个数组,或者说是一个指针。可以把函数返回改成: Load* Input(Load load[], int n);

c语言 结构体问题,第一个printf执行之后就程序崩溃了,把错误指出并改正...
include<stdio.h>#include<string.h>struct Student{intStudent_ID;char name[12];int score;};int main(void){int i,j;struct Student s[10];void sort(struct Student *p);for(i=0;i<10;i++){printf("请输入第%d位学生的学号:\\n",i+1);scanf("%d",&s[i].Student_ID);\/\/这里...

求助一个C语言结构体数组赋初值的问题
price; int d;} Test;对结构体赋值,一般是顺序赋值,或者指定赋值 比如 Test test[] = { {1, "abc", 1, 2, 1.2, 3},\/\/对应id, name, level, stock, price, d {.id = 2, .level=3, price=4.2, .stock=2},\/\/这个就是指定赋值,点后面接的是结构体成员名};

关于c语言结构体变量成员引用的问题
p是struct student*类型,stu是stu[3]这个数组的第一个元素的地址,p指向第一个元素,因此ABC都是对的,D错在把(int*)变量值赋值给(struct student*)变量,有个强制转换则不会错,因为age是结构体第一个变量,其地址就是结构体变量的地址。是指针间的赋值,必须保证左右操作数的指针类型是一致的。

C语言结构体一个问题?
将C代码在VC++中编译,经常会出现error C2275错误,结果是变量的定义位置不对,应该在函数块的最前面。这是一个编程习惯的问题。在移植c++代码到c的时候,经常会出现一个奇怪的错误:“error C2275: “xxxxx”: 将此类型用作表达式非法”这个错误是由于c的编译器要求将变量的申明放在一个函数块的头部...

相似回答