关于c语言 结构嵌套发什么的问题 200

//题目是定义一个结构类型可容纳五个学生,然后分别输出其五人的学号,名字,成绩,最后输出成绩最好的学生的学号和名字#include<stdio.h>structstude... //题目是定义一个结构类型可容纳五个学生,然后分别输出其五人的学号,名字,成绩,最后输出成绩最好的学生的学号和名字#include<stdio.h>struct student //结构类型学生的定义{ char munber[10]; //有字符串定义学生的学号 char name[10]; float score;} } printf("最优秀的学生是,学好为%s的%s同学\n",max.munber,max.name);}问题一,为什么在建立程序的时候有这样的错误(图一)问题二,在for循环中输入1024,周杰伦,1的时候尽然stu[0].munber,stu[0].name,stu[0].ccore都赋值错误(图二)所以输出的结果也是难看死了(图三)
main()
{
struct student stu[5];
struct student max=stu[0]; //定义一个空的变量并把第一个学生的数据赋值给他
int i;
for(i=0;i<5;i++) //用for循环输入学生数据
{
scanf("%s,%s,%f",stu[i].munber,stu[i].name,stu[i].score); //*********重点地方
if(max.score<stu[i].score)
max=stu[i]; //竟然一个在for里面一个值都没赋上
(中间差了mian函数,在这。)
展开
 我来答
卑躬屈膝的人生
2016-10-27 · 超过27用户采纳过TA的回答
知道答主
回答量:102
采纳率:0%
帮助的人:39.2万
展开全部

同学,就我看来,你的程序有如下几个问题:

1.结构体赋值是浅拷贝,意思就是直接结构体的内存的拷贝。如果遇上指针和数组,只是复制了指针或数组的地址,那么问题来了,如果指针指向的内存被释放,那么此时指针成为野指针,就会出现一些不可预见的问题。

如图,就你程序来说

student 结构体内有数组,max变量是stu[i]的浅拷贝,stu[i]到printf函数调用时已经没在使用,所以不同编译器会产生不同结果,max很可能会成野指针,如我gcc 5.1.0编译,结果如下:

2.当结构体变量是局部变量时,编译器对其分配内存并初始化,但是初始化的值是不确定的,需要自己清空。所以会出现你第三幅图,你看到一大堆烫字是因为没清零结构体中的

char munber[10]和char name[10];建议你手动清空内存。

3.你的stu数组输入方式scanf("%s,%s,%f",stu[i].munber,stu[i].name,stu[i].score);存在一定问题,我们输入字符串时,scanf函数会 以空格分隔,导致每行的输入都是stu[i].munber,stu[i].name,stu[i].score完全没有输入到,使用的是内存随机数据。

下面是我对你的程序的修改,能正常运行:

#include<stdio.h>

#include<memory.h>

struct student //结构类型学生的定义

{

    char number[10]; //有字符串定义学生的学号

    char name[10];

    float score;

};

int main()

{

    struct student stu[5];

int i;

    struct student *max=NULL;

    for(i=0; i<5; ++i)

{

//清空内存

memset(stu[i].number,0,10);

memset(stu[i].name,0,10);

stu[i].score = 0.0;

}

max = &stu[0];//指针指向stu第一个元素

    for(i=0; i<5; ++i)                            //用for循环输入学生数据

    {

        scanf("%s%s%f",&stu[i].number,&stu[i].name,&stu[i].score);

        if(max->score < stu[i].score)

        {

            max = &stu[i];//改变指针指向

        }

    }

printf("最优秀的学生是:学号为%s的%s同学\n",max->number,max->name);

    return 0;

}

以上是个人见解,不当之处望指正。

追问
第一关于野指针这个我还没有学到,第二关于手动清空内存在这里应该不是存在这个问题,因为在scanf是如果赋值都正确就不会出现烫字。(当然以上两个新的认识我会在以后的学习中注意,因为在工作中肯定会设计到这方面,谢谢)
第三,关于字符和字符串的输入,难道不能想其他类型一样(“%d,%f”,&a,&b)输入123,45.0这样的形式吗,只能用“ ”(空格)做分割?
追答
对的,字符串输入用默认scanf你只能以空格或回车输入。当然,如果你愿意,先读取一行指定字符串,然后再分割该字符串,也可以实现的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2016-10-27
展开全部

我说下,我发现的问题:1、main()函数没有定义类型,2、scanf()语句错误有两个,第一个,引号里面的两个逗号要取消,因为你在输入时如果有逗号逗号会被认为是字符,如果你真的想要在输入时有逗号,请自己百度,怎么在Scanf()的用法,第二个就是stu[i],score前面要加上&,因为他是float,我改后的代码如下:

#define  _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include<stdlib.h>
#include<string.h>
struct student //结构类型学生的定义
{
char munber[10]; //有字符串定义学生的学号
char name[10];
float score;
};

 void main()
{
struct student stu[5];
struct student max = stu[0];                    //定义一个空的变量并把第一个学生的数据赋值给他
int i;
for (i = 0; i < 5; i++)                              //用for循环输入学生数据
{
scanf("%s%s%f",stu[i].munber,stu[i].name,&stu[i].score);   //*********重点地方
if (max.score < stu[i].score)
max = stu[i];
}
printf("最优秀的学生是,学好为%s的%s同学\n", max.munber, max.name);
system("pause");
}
追问
第一,没有void main这种写法,虽然有些编译器支持(eg:vc),但是不标准,没有移植性,所以不被推荐使用 c99要求main的返回值为int,而且必须return(这是网上看到的回答)

【其实我也在对main()之前是否定义产生过疑问,到现在都不知道怎么分清,(int)main()和viod main()的作用,我从学习到现在都只用main(),可以详细讲吗】
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式