中易网

C语言结构体赋值问题

答案:4  悬赏:0  
解决时间 2021-02-23 03:07
结构体数组赋值问题我在使用结构体数组的时候遇到这个问题,想了好长时间也没弄明白其中的原因,程序如下:

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);
}

编译执行,能够得到正确结果。最后确定只是在对结构体数组各元素成员以循环方式输入数值的时候出了问题,即第一个程序加粗的两行。但是我百思不得其解,不知究竟是什么原因。请大家帮忙解决一下。
最佳答案
之所以出现你说的问题,是因为当执行
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();
}
就没问题了.
全部回答
你所谓的加粗的两行我没看到,不过我还是找到了你的错误,注意错误如下: 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);
首先这样编译会出错。 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}}; ==== [原创回答团]
按你的程序你要这样输入才行: 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
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
彭家堡这个地址在什么地方,我要处理点事
让人办信用卡会不会把钱花完后让你还钱
平行进口陆地巡洋舰16款4000五座好不好油耗多
李云波汽修怎么去啊,有知道地址的么
正方宜三分厂地址有知道的么?有点事想过去
小天鹅波轮洗衣机水位传感器在哪
如何构建融资租赁公司内部组织结构
在惠州水口坐K69路车到深圳车费
1994年阳历是5月9日阴历是几号
贵华窗帘地址在什么地方,想过去办事
玛丽大酒店地址在哪,我要去那里办事
微信抢红包防挂
我是干通信的 近期因为公司要我去学习 电信 F
我叫刘渊,请大家帮我想一个好看好记好听的英
衢州市市政工程管理处地址在什么地方,想过去
推荐资讯
鸿起顺旅店在什么地方啊,我要过去处理事情
感情很好,没有基础的成语是什么?
我的MacBookair装了Windows10后没WLAN选项 怎
野生红百合泡水有什么作用
LOL,求喷人技巧
断桥铝哪个牌子好,卡帝门窗 断桥铝门窗价格
敖勒盖音吉拉格在什么地方啊,我要过去处理事
你好,华为手机颜色变黄怎么回事?
史上最感动的短信或话语
太阳烤吧地址在什么地方,想过去办事
为什么做俯卧撑脖颈和脑袋连接处会抽筋
交道口东大街/安定门内大街(路口)在什么地方
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?