关于c语言 结构嵌套发什么的问题 200
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函数,在这。) 展开
同学,就我看来,你的程序有如下几个问题:
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(),可以详细讲吗】