一袭白衣梅子酒 2019-12-22 21:00 采纳率: 100%
浏览 332
已采纳

救救孩子吧!如何解决读取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条回答 默认 最新

  • 关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 1月2日

悬赏问题

  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch