C语言 求大神纠错 我试了好多次了 还是整不明白 谢谢 (显示无语法错 就是输入学号后显示要关闭)

/*学生查询功能按学号查找*/
void serch()
{
STUDENT stu[3];
FILE *fp;
int i, j=0;
char ID[5];
printf("input your ID:");
scanf("%s",ID[j]);
if((fp=fopen("D:\\student.txt","r"))==NULL)
{
printf("Failure to open student.txt!\n");
exit(0);
}
for(i=0;i<N;i++)
{
if(stu[i].ID==ID[j])
{
fread(&stu[i],sizeof(STUDENT),1,fp);
printf("%s%s% c%d%d",stu[i].ID,stu[i].name,stu[i].sex,stu[i].Escore,stu[i].Cscore);
}
}
fclose(fp);
}

首先是个语法上的错误,ID[] 数组相当于个字符串,你姑且可以这么理解
Id[j] 是一个字符 ID[0] ID[1]....等等字符组在一起也就是一个字符串了

而%s即是代表字符串的意思,由这种格式输入的东西应该被存在一个字符串里,你放在ID[j]里就不对了,因为他存不下,会出现内存错误。
你所看到的要关闭一般情况下都是由内存错误引起的,遇到类似错误后应该看看是否有了相似的错误
把ID[j]都改成ID就好了
话说你的str里面的成员ID是什么类型?数组?存学号不是太大的话没有必要用数组吧,一个int型就够了呀,能有多少学生哦

还有你的for循环里
看你的意思是输出与Id里面的学号对应的学生的信息,那是不是应该先读数据,然后再对比,相等后再输出?你现比较再读取是怎么回事儿?没读呢你的if(stu[i].ID==ID[j]) 里面stu是什么?

我改了一下,没有实践不知道会不会出错哈假设你的文件里只存了3个学生(看你的意思是这样的)
for(i=0;i<N;i++)
{
fread(&stu[i],sizeof(STUDENT),1,fp);
if(stu[i].ID==ID[j])
{
printf("%s%s% c%d%d",stu[i].ID,stu[i].name,stu[i].sex,stu[i].Escore,stu[i].Cscore);
}
}
- -, 话说我好像没改什么东西,只是调了一下顺序,杯具
还有就是你这里的stu只是个临时变量而已,在循环里stu[0]用过一次之后就没有用了,这里完全不需要结构体数组,一个结构体就够了,每次都重复利用一个stu的内存空间,呵呵追问

1. 前面if((fp=fopen("D:\\student.txt","r"))==NULL) 这个不是已经以只读方式打开文件么 ?所以我就先写fread了,是想如果比较的学号一样就只读该学号学生的所有信息再打出来 ,我是这么理解的,不知道对不对
2.stu[i].ID是字符串类型
3.话说我调完顺序还是不对。还有“stu只是个临时变量而已,在循环里stu[0]用过一次之后就没有用了”这句我没懂,什么stu[0] ?
ps:真的非常感谢你的回答!!

追答

1. fopen只是打开你想操作的文件,这个过程只获得一个文件描述符:fp,这样你就可以认为fp就是“student.txt” ,然后才可以用fread去读
也就是吃饭的过程,stu[i]就是那个碗,fp就是电饭锅,fopen是打开电饭锅的盖子(这时候你的碗里什么都没有),fread是用勺子把饭盛到碗里
你可以去看看fread的解释,百科就可以,他的意思是从fp中读取sizeof(STUDENT)大小的数据,单位大小是1字节,并把数据存入&stu[i] 所指向的内存中,只有经历这个过程,你的stu里面才会有数据,知识fopen是不行的。
2. 如果stu[i].ID是字符串类型,那么比较字符串的时候应该用strcmp,而不能用 == 来进行比较,这里建议你用int型比较好
3. 你理解了fopen和fread的意义就应该能解释这个问题了,fopen只是打开文件,fread才是读取内容到stu中
你是不是认为fopen之后stu里面就存着3个学生的数据了?不是的,而是每个fread之后会像stu[i]中存入一个学生的数据,每个循环取一个,循环3次就是3个人

如果依然遇到错误可以把具体错误贴出来,不要说得那么笼统,那样解决不了问题,信息量太大的话你可以百度hi我

来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-05
scanf("%s",ID[j]);
这个ID[j]只是字符,应该要输入地址啊

两种改法

要么你申明 char ID[5][1000]
要么你改成
scanf("%s",ID);追问

谢谢 改完后 请问输入学号后还是没输出信息 就黑了并以横向光标闪啊闪 是咋回事

追答

查查 字符串长度是否足够
N到底有多大
if(stu[i].ID==ID[j]) 这种比较也是错的 应该用strcmp 函数

第2个回答  2013-04-05
scanf("%s",ID[j]);

这里不太对,ID[j]是一个char,而这里你想获得是一个字符串,应该是
scanf("%s",ID);追问

谢谢 改完后 请问输入学号后还是没输出信息 就黑了并以横向光标闪啊闪 是咋回事

追答

if(stu[i].ID==ID[j])

这里是不对的。

还有 你的数据文件时什么情况?这个for循环能正常结束吗??

追问

我是想建个字符数组保存输入的学号 在从文件里读取学号信息 然后在for循环里挨个比较 一样的就输出学生的所有信息 (那个我改成这样if(strcmp(stu[i].ID,ID[j])==0) 还是不对)TAT

追答

你输入的是ID,为什么拿ID[j]这个单个字符去比较呢??

追问

那啥 我把j初始化为0 以为ID[j]里存的就是输入的学号了

第3个回答  2013-04-05
scanf("%s", ID)追问

谢谢 改完后 请问输入学号后还是没输出信息 就黑了并以横向光标闪啊闪 是咋回事

追答

for 循环有问题,你这样写的目的是什么, 比较字符串相等应该用strcmp

追问

我是想建个字符数组保存输入的学号 在从文件里读取学号信息 然后在for循环里挨个比较 一样的就输出学生的所有信息 (那个我改成这样if(strcmp(stu[i].ID,ID[j])==0) 还是不对)TAT

追答

你的意思是输入一个学号然后, 然后文件中一个完整学生的信息, 拿这个学号与学生的学号作比较,如果相等就输出这个学生的信息

还有你文件中的学生信息是如何存的, fread事一个学生信息到结构体中,字符串如学生ID是是否有0结尾,for中找到该学生信息后应该break退出

另外我给你一下我的思路吧,在正规的开发中,强调函数的功能单一性,只做它该做的事,也即所谓模块化, 你这查找功能 的函数应该这样定义才比较好 , 当然前期学习你可以那样做,但最好保持良好习惯
BOOL search(const char* stuID, FILE* fp, stu* out); //查找
void print(stu* pstu); //输出学生信息

相似回答