C语言---运行这个代码的时候出现unhandled exception (中间一串东西) Access Violation怎么解决?

/*创建班级学生成绩数据库程序*/
#include <stdio.h>
#include <conio.h>
struct stu
{
int xh; /*学号*/
char name[10]; /*姓名*/
int yw; /*语文*/
int sx; /*数学*/
int zf; /*总分*/

}s[20];

void main()
{

FILE *fp;
int i;
struct stu sl;
fp=fopen("sjk.txt","w");
printf("\t\t班级学生成绩数据库\n\n");
for(i=0;i<3;i++)
{
printf("\n学号: ");
scanf("%d",&s[i].xh);
printf("\n姓名: ");
scanf("%s",&s[i].name);
printf("\n语文: ");
scanf("%d",&s[i].yw);
printf("\n数学: ");
scanf("%d",&s[i].sx);
fprintf(fp,"%d\n%s\n%d\n%d\n%d\n",s[i].xh,s[i].name,s[i].yw,s[i].sx);
}
fclose(fp);
fp=fopen("sjk.txt","r");
while( fscanf(fp,"%d\n%s\n%d\n%d\n%d\n",&sl.xh,sl.name,&sl.yw,&sl.sx)!=EOF)
printf("\n %d,%s,%d%d%d\n\n",sl.xh,sl.name,sl.yw,sl.sx);
fclose(fp);

}

请问同学你要干嘛?

在查找的时候你用了所谓的二分法(而且写错了,进入for之后mid就一直不变了),其实查找的话不用二分的,直接顺序查找就行了
帮你的二分改了下:

while(1)
{
mid=(low+high)/2;
if(stt.id==stu[mid].id){
printf("%d",mid);
break;
}
else
if(stt.id<stu[mid].id)
high=mid;
else
low=mid;
if(high<=low)
break;
}

你的逻辑有点问题,你是要删除找到的学号和名字,所以应该是!=而不是==

字符串比较不能直接比较,所以stu[i].name==stt.name这样是错的,要用strcmp函数if(stu[i].id!=stt.id && strcmp(stu[i].name,stt.name))

删除时过早地指向了下个元素,if中的那个i++应该去掉的,而在for中的k++应该放到if中

最后你用%s输出时,却对应成std[k].name[50],这个指的是输出name中第50个字符,却用%s输出字符,明显不对。。。这就是基础不牢固了,应该是std[k].name

下面是帮你修改好的程序:
#define N 2
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//建立一个学生的结构体
struct student
{
int id;//学号
char name[50];//姓名
};
void main()
{
int i,k,low,high,mid;
//定义结构体数组成员
struct student stu[N],std[N-1],stt;
printf("请输入学生号及姓名:\n");
for(i=0;i<N;i++)
{
printf("输入第%d学生的学号:\n",i+1);
scanf("%d",&stu[i].id);
printf("输入第%d学生的姓名:\n",i+1);
scanf("%s",stu[i].name);
}
printf("请输入要删除的学生学号:\n");
scanf("%d",&stt.id);
printf("请输入要删除的学生姓名:\n");
scanf("%s",stt.name);
//查找要删除的学生的位置
low=0;
high=N;

while(1)
{
mid=(low+high)/2;
if(stt.id==stu[mid].id){
printf("%d\n",mid);
break;
}
else
if(stt.id<stu[mid].id)
high=mid;
else
if(stt.id>stu[mid].id)
low=mid;
if(high<=low)
break;
}
//删除所要删除的学生信息
for(i=0,k=0;i<N;i++)
{
if(stu[i].id!=stt.id && strcmp(stu[i].name,stt.name))
{
std[k].id=stu[i].id;
strcpy(std[k].name,stu[i].name);
k++;
}
}
for(k=0;k<N-1;k++)
{
printf("%d\n%s\n",std[k].id,std[k].name);
}
printf("\n");
system("pause");
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-24
换台机器试试
相似回答