矛盾
编译没有错,运行强制停止,什么问题?

本帖最后由 绯色の胖子 于 2015-6-12 18:10 编辑

大神们,这个程序编译没有错,运行强制停止,什么问题?运行的时候 点5 就是 添加后报道的学生 只要是添加 就出错停止运行

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <string.h>

#define SIZE 7

struct student

{char num[20];

char name[10];

char time;

}std[SIZE];

void menu();

void dianming();

void absent();

void add();

void save();

void main()

{

int i,k;

FILE *fp;

if((fp=fopen("e:\\file20.txt","r"))==NULL)

{

printf("文件打开失败\n");

exit(0);

}

for(i=0;i<SIZE;i++)

fscanf(fp,"%s %s %c",std.num,std.name,&std.time);

printf("**************************************************************************\n");

printf("**************************************************************************\n");

printf("****************************欢迎使用上课随机点名程序**********************\n");

printf("****** 输入1:显示所有同学点名情况 *********\n");

printf("****** 输入2:开始点名 *********\n");

printf("****** 输入3:更新文件 *********\n");

printf("****** 输入4:缺席同学的情况 *********\n");

printf("****** 输入5:添加后报道学生信息 *********\n");

printf("****** 输入6: 退出 *********\n");

printf("**************************************************************************\n");

while(1)

{printf("please choose ");

scanf("%d",&k);

switch(k)

{

case 1:

printf("number name Y or N\n");

for(i=0;i<SIZE;i++)

printf(" %s %s %c\n",std.num,std.name,std.time);

break;

case 2:

dianming();

break;

case 3:

save();

printf("****************************文件更新成功!退出请按5**************************\n");

break;

case 4: absent();

break;

case 5:

/*添加学生信息*/add();

break;

case 6:

exit(0);

}

fclose(fp);

}

}

void add()

{

FILE *fp;

int n,i;

struct student stu;

if((fp=fopen("e:\\file20.txt","a"))==NULL)

{

printf("文件打开失败\n");

exit(0);

}

else //如果文件已经存在,可以追加学生信息

{printf("请输入要添加的学生数量,按回车键确认:");

scanf("%d",&n);

for(i=1;i<=n;i++)

{

printf("\n请输入第%d个学生的学号 姓名 缺席情况,用空格分开,并按回车键确认:\n",i);

scanf("%s%s",stu.num,stu.name);

fprintf(fp,"%s %s %s\n",stu.num,stu.name,stu.time);

}

}

fclose(fp);

}

void dianming()

{int n,j,m;

printf("请输入数量:");

scanf("%d",&n);

j=rand()%7;/*调用rand函数进行点名*/

for(j=0;j<n;j++)

{ printf(" %s %s ",std[j].num,std[j].name);

printf("缺席请按1否则请按2:");

scanf("%d",&m);

if(m==1)

std[j].time='Y';

else

if(m==2)

printf("没有缺席");}

}

void absent()

{int i;

for(i=0;i<SIZE;i++)

if(std.time!='N')

printf(" %s %s %c\n",std.num,std.name,std.time);

}

void save()

{int i;

FILE *fp;

if((fp=fopen("e:\\file20.txt","w+"))==NULL)

{printf("文件打开失败\n");

exit(0);}

for(i=0;i<SIZE;i++) {fprintf(fp,"%s %s %c\n",std.num,std.name,std.time);

}}

bai200255
编译没问题不一定就是
展开Biu

编译没问题不一定就是ok的,闪退应该是运行时问题

大致看了一下,没细想,你可以考虑:是不是程序瞬间执行完毕,while部分没有停顿、是不是读或写文件错了导致程序错误……

你可以一部分一部分的输出一些调试信息,

[查看全文]
张全蛋
麻烦你能把这个程序的具体要求写出来吗
展开Biu

那啥,麻烦你能把这个程序的具体要求写出来吗?你的代码我改了几次,感觉效果不是很理想,特别是你在读取文件内容到内存中,却使用数组这种定长的数据结构来存放,因为文件内容如果没有事先设计好,程序怎么能知道应该读取几条数据?而且你既然包含了添加信息的功能,那么文件的内容也就是可变的,更不应该使用固定长度的方式,换成链表才更实际点。麻烦你直接说一下这个程序要实现的各种功能,以及你那个记录学生的编号,姓名,以及缺席记录的文件内容是按什么格式组织的,直接用文字说一下吧。你贴了代码我反而不好改了,代码的风格太乱,适当把函数声明,和函数的实现分别拆开放在头文件,源文件中,不要这样直接在主函数文件里面堆叠。

[查看全文]