救救孩子吧!如何解决读取txt文件出现索引超出了数组的范围的问题

#include
#include
void main()
{
typedef struct LNode
{
char name[6];
int no;
int yw;
int sx;
int yy;
struct LNode* next;
}LinkList;
struct NameNo
{
int no;
int yw;
int sx;
int total;
char name[6];
}st[10];
FILE* fp, * fp1;
char ch, sname[6];
int x, i, j;
NameNo tmp;
LinkList* p, * s;
printf("\n");
printf("-------------------------------");
printf("学生成绩管理系统");
printf("--------------------------------");
printf("\n\n");
printf("在您的C盘根目录下是否有cj1.txt和cj2.txt文件?如果有请输入1,");
printf("否则输入0;如果没有,那么程序将终止!1 or 0?");
scanf("%d", &i);
if (i == 0) return;
printf("\n\n");
printf("对cj1.txt和cj2.txt进行合成请按''");
scanf("%d", &i);
if (i != 1) return;
printf("正在把cj1.txt和cj2.txt中的数据进行合并\n");
printf("......\n.....\n....\n...\n..\n.\n");
if ((fp = fopen("c:\cj1.txt", "rt")) == NULL) //从文本文件cj1.txt中读取数据传向cj3.txt
{
printf("无cj1.txt文本文件,程序结束。\n");
return;
}
fp1 = fopen("c:\cj3.txt", "wt");
ch = fgetc(fp);
while (ch != EOF)
{
fputc(ch, fp1);
ch = fgetc(fp);
}
fclose(fp1);
fclose(fp);
if ((fp = fopen("c:\cj2.txt", "rt")) == NULL) //从文本文件cj2.txt中读取数据接到cj3.txt的后面
{
printf("无cj12.txt文本文件,程序结束。\n");
return;
}
fp1 = fopen("c:\cj3.txt", "a");
for (i = 0; i < 37; i++)
fgetc(fp);
ch = fgetc(fp);
while (ch != EOF)
{
fputc(ch, fp1);
ch = fgetc(fp);
}
fclose(fp1);
fclose(fp);
printf("合并成功!现在你可以在C盘根目录下看到一个cj3.txt文件\n");
printf("\n\n");
p = (LinkList*)malloc(sizeof(LinkList));
p->next = NULL;
fp = fopen("c:\cj3.txt", "rt");//从合成后的cj3.txt读取数据,生成链表
for (i = 0; i < 36; i++)
fgetc(fp);
ch = fgetc(fp);
while (ch != EOF)
{
s = (LinkList*)malloc(sizeof(LinkList));
fgets(s->name, 6, fp);
for (i = 0; i < 5; i++)
fgetc(fp);
x = fgetc(fp) - 48;
x = x * 10 + fgetc(fp) - 48;
s->no = x;
for (i = 0; i < 5; i++)
fgetc(fp);
x = fgetc(fp) - 48;
x = x * 10 + fgetc(fp) - 48;
s->yw = x;
for (i = 0; i < 5; i++)
fgetc(fp);
x = fgetc(fp) - 48;
x = x * 10 + fgetc(fp) - 48;
s->sx = x;
for (i = 0; i < 5; i++)
fgetc(fp);
x = fgetc(fp) - 48;
x = x * 10 + fgetc(fp) - 48;
s->yy = x;
s->next = p->next;
p->next = s;
ch = fgetc(fp);
}
fclose(fp);
printf("对cj3.txt中有不及格的学生信息生成cj4.txt请按''");
scanf("%d", &i);
if (i != 1) return;
printf("正在生成cj4.txt\n");
printf("......\n.....\n....\n...\n..\n.\n");
if (i == 1)
fp = fopen("c:\cj4.txt", "wt");//把三科成绩中有补考的学生信息放入cj4.txt
fputs("姓 名 学号 语文 数学 英语", fp);
fclose(fp);
fp = fopen("c:\cj4.txt", "a");
s = p->next;
while (s != NULL)
{
if (s->yw < 60 || s->sx < 60 || s->yy < 60)
{
ch = '\n';
fputc(ch, fp);
fputs(s->name, fp);
for (i = 0; i < 5; i++)
{
ch = ' ';
fputc(ch, fp);
}
ch = s->no / 10 + 48;
fputc(ch, fp);
ch = s->no - (s->no / 10) * 10 + 48;
fputc(ch, fp);
for (i = 0; i < 5; i++)
{
ch = ' ';
fputc(ch, fp);
}
ch = s->yw / 10 + 48;
fputc(ch, fp);
ch = s->yw - (s->yw / 10) * 10 + 48;
fputc(ch, fp);
for (i = 0; i < 5; i++)
{
ch = ' ';
fputc(ch, fp);
}
ch = s->sx / 10 + 48;
fputc(ch, fp);
ch = s->sx - (s->sx / 10) * 10 + 48;
fputc(ch, fp);
for (i = 0; i < 5; i++)
{
ch = ' ';
fputc(ch, fp);
}
ch = s->yy / 10 + 48;
fputc(ch, fp);
ch = s->yy - (s->yy / 10) * 10 + 48;
fputc(ch, fp);
s = s->next;
}
else
s = s->next;
}
fclose(fp);
printf("生成成功!现在你可以在C盘根目录下看到一个cj4.txt文件");
printf("\n\n");
s = p->next;//将学生信息从链表复制到数组中
for (i = 0; i < 10; i++)
{
st[i].no = s->no;
st[i].yw = s->yw;
st[i].sx = s->sx;
st[i].total = s->yw + s->sx + s->yy;
for (j = 0; j < 7; j++)
st[i].name[j] = s->name[j];
s = s->next;
}
printf("用直接插入法排序请按'':");
scanf("%d", &i);
printf("\n\n");
if (i == 1)
{
for (i = 1; i < 10; i++)//直接插入法排序
{
tmp = st[i];
j = i - 1;
while (j >= 0 && tmp.total > st[j].total)
{
st[j + 1] = st[j];
j--;
}
st[j + 1] = tmp;
}
printf(" 直接插入法排序后总分从大到小排序为\n");
printf("\n\n");
printf("姓 名 学号 语文 数学 英语 总分\n");
for (i = 0; i < 10; i++)
{
if (st[i].no < 10)
{
printf("%s ", st[i].name);
printf("%d", 0);
printf("%d ", st[i].no);
printf("%d ", st[i].yw);
printf("%d ", st[i].sx);
printf("%d ", st[i].total - st[i].yw - st[i].sx);
printf("%d\n", st[i].total);
printf("\n");
}
else
{
printf("%s ", st[i].name);
printf("%d ", st[i].no);
printf("%d ", st[i].yw);
printf("%d ", st[i].sx);
printf("%d ", st[i].total - st[i].yw - st[i].sx);
printf("%d\n", st[i].total);
printf("\n");
}
}
}
printf("将排好序的数组打乱\n");
printf("\n");
s = p->next;//将排好序的数组打乱,从新用冒泡法排序
for (i = 0; i < 10; i++)
{
st[i].no = s->no;
st[i].yw = s->yw;
st[i].sx = s->sx;
st[i].total = s->yw + s->sx + s->yy;
for (j = 0; j < 7; j++)
st[i].name[j] = s->name[j];
s = s->next;
}
printf("用冒泡法排序请按'':");
scanf("%d", &i);
printf("\n\n");
if (i == 1)
{
for (i = 0; i < 9; i++)//冒泡法排序
{
for (j = 9; j > i; j--)
if (st[j].total > st[j - 1].total)
{
tmp = st[j];
st[j] = st[j - 1];
st[j - 1] = tmp;
}
}
printf(" 冒泡法排序后总分从大到小排序为\n");
printf("\n\n");
printf("姓 名 学号 语文 数学 英语 总分\n");
for (i = 0; i < 10; i++)
{
if (st[i].no < 10)
{
printf("%s ", st[i].name);
printf("%d", 0);
printf("%d ", st[i].no);
printf("%d ", st[i].yw);
printf("%d ", st[i].sx);
printf("%d ", st[i].total - st[i].yw - st[i].sx);
printf("%d\n", st[i].total);
printf("\n");
}
else
{
printf("%s ", st[i].name);
printf("%d ", st[i].no);
printf("%d ", st[i].yw);
printf("%d ", st[i].sx);
printf("%d ", st[i].total - st[i].yw - st[i].sx);
printf("%d\n", st[i].total);
printf("\n");
}
}
}
printf("\n");
printf("请输入你要查找的学生姓名:(注意:如果名字为两个字,则中间用两个空格!)\n");
do {
x = 1;
if (i == 1)
printf("输入姓名:");
getchar();
for (i = 0; i < 7; i++)
sname[i] = getchar();
for (i = 0; i < 10; i++)//在数组中顺序查找
{
for (j = 0; st[i].name[j] == sname[j]; j++) {}
if (j == 6)
{
printf(" 数组中查找结果");
printf("\n\n");
printf("姓 名 学号 语文 数学 英语 总分\n");
printf("%s", st[i].name);
printf(" %d", st[i].no);
printf(" %d", st[i].yw);
printf(" %d", st[i].sx);
printf(" %d", st[i].total - st[i].yw - st[i].sx);
printf(" %d\n\n", st[i].total);
x = 0;
}
}
if (x != 0)
printf(" 查无此人!\n");
s = p->next;
while (s != NULL)//在链表中顺序查找
{
for (i = 0; s->name[i] == sname[i]; i++) {}
if (i == 6)
{
printf(" 链表中查找结果");
printf("\n\n");
printf("姓 名 学号 语文 数学 英语 总分\n");
printf("%s", s->name);
printf(" %d", s->no);
printf(" %d", s->yw);
printf(" %d", s->sx);
printf(" %d", s->yy);
printf(" %d\n\n", s->yw + s->sx + s->yy);
x = 0;
}
s = s->next;
}
if (x != 0)
printf(" 查无此人!\n");
i = 0;
printf("继续查找请按''");
scanf("%d", &i);
} while (i == 1);
printf("\n\n");
printf("-----------------------------谢谢使用!--------------------------------\n\n");
}
请问如何解决索引超出了数组的范围这一问题
现有学生成绩信息文件1(1.txt),内容如下
姓名 学号 语文 数学 英语

张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
学生成绩信息文件2(2.txt),内容如下:
姓名 学号 语文 数学 英语

陈果 31 57 68 82
李华明 32 88 90 68
张明东 33 48 42 56
李明国 34 50 45 87
陈道亮 35 47 58 77
…. .. .. .. …

图片说明

1个回答

weixin_43674271
weixin_43674271 好像不是这个原因...
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问