结构体数组赋值问题我在使用结构体数组的时候遇到这个问题,想了好长时间也没弄明白其中的原因,程序如下:
main()
{
struct abc
{
char name;
int a;
float b;
};
struct abc stu[3];
int i;
printf("please input:\n");
for(i=0;i<3;i++)
scanf("%c %d %f",&stu[i].name,&stu[i].a,&stu[i].b);
printf("you just input:\n");
for(i=0;i<3;i++)
printf("%-5c%-10d%-10.2f",stu[i].name,stu[i].a,stu[i].b);
}
这是一个试验程序,在给结构体数组赋值后就原样输出以验证赋值是否正确。但是程序执行时没有显示结果即退出。把结构体数组改成只有一个结构体变量,程序如下:
main()
{
struct abc
{
char name;
int a;
float b;
};
struct abc stu;
printf("please input:\n");
scanf("%c %d %f",&stu.name,&stu.a,&stu.b);
printf("%5c%10d%10.2f",stu.name,stu.a,stu.b);
}
编译执行,可以得到预期结果。我想验证是不是循环的问题,又将程序改成下面这样:不用求输入数据,而在程序内部给结构体变量数组赋初值,然后再用循环输出,程序如下:
main()
{
struct abc
{char name;
int a;
float b;
};
struct abc stu[3] = {{'a',12,34},{'b',56,78},{'c',90,12}};
int i;
for(i=0;i<3;i++)
printf("\n%-5c%-10d%-10.2f",stu[i].name,stu[i].a,stu[i].b);
}
编译执行,能够得到正确结果。最后确定只是在对结构体数组各元素成员以循环方式输入数值的时候出了问题,即第一个程序加粗的两行。但是我百思不得其解,不知究竟是什么原因。请大家帮忙解决一下。
C语言结构体赋值问题
答案:4 悬赏:0
解决时间 2021-02-23 03:07
- 提问者网友:冰点阿弟
- 2021-02-22 02:50
最佳答案
- 二级知识专家网友:冷态度
- 2021-02-22 03:55
之所以出现你说的问题,是因为当执行
for(i=0;i<3;i++)
scanf("%c %d %f",&stu[i].name,&stu[i].a,&stu[i].b);
这步的时候,由于回车也算是一个字符,循环的时候把回车也赋给name了/所以输出的时候就会错误了.想解决这个问题只要把回车那个字符给吃掉就可以了.把这个循环改成:
for(i=0;i<3;i++)
{
scanf("%c %d %f",&stu[i].name,&stu[i].a,&stu[i].b);
getchar();
}
就没问题了.
for(i=0;i<3;i++)
scanf("%c %d %f",&stu[i].name,&stu[i].a,&stu[i].b);
这步的时候,由于回车也算是一个字符,循环的时候把回车也赋给name了/所以输出的时候就会错误了.想解决这个问题只要把回车那个字符给吃掉就可以了.把这个循环改成:
for(i=0;i<3;i++)
{
scanf("%c %d %f",&stu[i].name,&stu[i].a,&stu[i].b);
getchar();
}
就没问题了.
全部回答
- 1楼网友:一场云烟
- 2021-02-22 06:30
你所谓的加粗的两行我没看到,不过我还是找到了你的错误,注意错误如下:
scanf(\"%c %d %f\",&stu[i].name,&stu[i].a,&stu[i].b);
在你循环输入的时候,你的第一个要输入的数据都是字符,当然第一次输入值传进去了,当你要输入第二个值时,你要敲回车(在计算机中键盘上的键它都认为是字符),所以计算机也把回车当作字符了,这样你后便输入的值也就牛头不对马嘴了,所以输出的是乱码(第一组数据对,后面的就乱了),所以你要注意在输入字符的时候最好在 c%前空一格,以防万一。修改上句如下:
scanf(\" %c %d %f\",&stu[i].name,&stu[i].a,&stu[i].b);
- 2楼网友:恕我颓废
- 2021-02-22 05:47
首先这样编译会出错。
struct
{
char ch;
int pri;
}
定义结构体类型,后面没有跟分号,说明后面是该类型的变量列表,之后遇到pri接下来的空格后面跟的lpri编译器就不知道要干什么了。
如果用struct
{
char ch;
int pri;
};,还是出错,因为之后的pri没有声明或定义。
如果用struct pri
{
char ch;
int pri;
};,纯c的话不行,pri是结构体名而不是类型名,会编译出错。c++下会把pri当作struct pri,不会出错。
可以这么写:
typedef struct
{
char ch;
int pri;
}pri;
pri lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}};
pri rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
最后两行也可以这样写:
pri lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
注意倒数第二行是分号还是逗号会影响初始化列表的语义。
(顺便,这个不是赋值。)
话说回来,一开始的写法去掉pri是正确的(只是定义之后无法访问该类型,一般不推荐):
struct
{
char ch;
int pri;
}
lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
====
[原创回答团]
- 3楼网友:兮沫♡晨曦
- 2021-02-22 04:49
按你的程序你要这样输入才行:
a 1 3b 2 5c 3 6
如果是这样:scanf("%c %d %f\n",&stu.name,&stu.a,&stu.b);
则可以这样一行一行输入:
a 1 3
b 2 5
c 3 6
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯