首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个通讯录小程序,每次到输入性别的时候就出现0x0000005异常

2013-01-23 
一个通讯录小程序,每次到输入性别的时候就出现0x0000005错误各路大神,本人初学c,最近对着书编了个通讯录程

一个通讯录小程序,每次到输入性别的时候就出现0x0000005错误
各路大神,本人初学c,最近对着书编了个通讯录程序,运行无错,但是每当到输入性别时,就会显示程序已停止运行,调试了好久不知道是什么情况,在vc中会出这个错误,但是我换一个“C与C++程序设计学习与实验系统”运行的时候就不会出现这个问题,这是怎么一回事呢?求教各路大神,万分感谢~一个通讯录小程序,每次到输入性别的时候就出现0x0000005异常


#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <string.h>

struct addr//定义地址结构体
{
char post_num[10];//邮编
char addrs[40];//地址
};

struct birth //生日结构体
{
int year;
int month;
int day;
};

struct friend1/*通讯录结构定义*/
{
int number;//序号
char name[20];//名字
char sex;//性别
struct birth births;//出生日期
struct addr addrs;//地址
char telphone[13];//电话
}friends[50];

FILE *fp;//定义文件指针*fp
int i;
void Data_Load()//读取通讯录
{
int j;
long k;
fp = fopen("friend.txt","r+t");
if (fp != NULL)//文件已经存在时
{
for (i = 1;i<50;i++)//循环的写入每一条记录
{
if (j = fgetc(fp) == EOF)//判断是否到了文件尾部
return;
k = i-1;
fseek(fp,k*sizeof(struct friend1),SEEK_SET);
fread(&friends[i],sizeof(struct friend1),1,fp);
}
}
else//文件不存在,创新新文件
{
fp = fopen("friend.txt","w");
i = 1;
}
}

void Data_Show(int j)//显示信息
{
printf("\n\n\tNO.:%3d\n",friends[j].number);
printf("\n\n\tNAME:%-20s\n\t性别:%c\n",friends[j].name,friends[j].sex);
printf("\n\tBIRTHDAY:%4d%2d%2d",friends[j].births.year,friends[j].births.month,friends[j].births.day);
printf("\n\tPOST NUMBER:%-10s",(friends[j].addrs).post_num);
printf("\n\tADDRESS:%-40s",friends[j].addrs.addrs);
printf("\n\tTELPHONE:%-13s",friends[j].telphone);
}

void data_input(int j)//j代表新增的信息的序号
{
fflush(stdin);
friends[j].number = j;
printf("\n\n\n\tNO. %d RECORD",j);
printf("\n\n\tNAME:");
scanf("%s",friends[j].name);
printf("\n\n\tSEX(M/F):");
scanf("%s",friends[j].sex);
printf("\n\n\tBIRTHDAY:");
printf("\n\t\tYEAR:");
scanf("%s",friends[j].births.year);
printf("\n\t\tMONTH:");
scanf("%s",friends[j].births.month);
printf("\n\t\tDAY:");
scanf("%s",friends[j].births.day);
printf("\n\tPOST NUMBER:");
scanf("%s",friends[j].addrs.post_num);
printf("\n\tADDRESS:");
scanf("%s",friends[j].addrs.addrs);
printf("\n\tTELPHONE:");
scanf("%s",friends[j].telphone);
}

void data_save()//存档
{
int j;
fp = fopen("friend.txt","w");
for(j = 1;j<i;j++)
{
fwrite(&friends[j],sizeof(struct friend1),1,fp);
}

}

main()
{
int j,k;
char ch;
char *search_name;
//clrser();
Data_Load();
i--;
do 
{
printf("\n\n\n\tCHOOSE:");
printf("\n\t1.READ");
printf("\n\t2.APPEND");
printf("\n\t3.DELETE");
printf("\n\t4.SEARCH");
printf("\n\t5.INSERT");
printf("\n\t6.SAVE AND EXIT");
printf("\n\t7.QUIT");
printf("\n\n");
printf("\tCHOOSE:");
ch = getche();
switch(ch)
{
case '1': 
j = 1;
while(getche()&&j<= 1)
{
Data_Show(j++);
}
if(j>i)
{
printf("\n\nEnd of e_note\n");
}
break;
case '2':
while(getche() != 0x1b&&i<50)//0x1b为ESC按键的16进制码


{
i++;
data_input(i);
}
if (i == 50)
{
printf("\n\te_note is filled\n");
}
break;
case '3':
if (i<1)
{
printf("\n\tNO SUCH RECORD!\n");
break;
}
printf("\n\t INPUT THE NO:");//读取删除的位置
scanf("%d",&k);
for (j = k;j<i;j++)//删除记录的算法,即将后面的数据项整体前移一格
{
strcpy(friends[j].name,friends[j+1].name);
friends[j].sex = friends[j+1].sex;
friends[j].births.year = friends[j+1].births.year;
friends[j].births.month = friends[j+1].births.month;
friends[j].births.day = friends[j+1].births.day;
strcpy(friends[j].addrs.post_num,friends[j+1].addrs.post_num);
strcpy(friends[j].addrs.addrs,friends[j+1].addrs.addrs);
strcpy(friends[j].telphone,friends[j+1].telphone);
}
i--;//记录的总数减一
break;
case '4'://查找联系人
printf("\n\t INPUT NAME:");
gets(search_name);
for (j = 1;j<i;j++)
{
if (strcmp(search_name,friends[j].name) == 0)//用字符串比较来判断是否找到了所需的元素项
{
Data_Show(j);//显示记录
break;
}
}
if (j>i)//查找失败时
{
printf("\n\t NO RECORD !");
}
break;
case '5'://插入新联系人
printf("\n\tInsert NO:");//选择插入的序号
scanf("%d",&k);
for (j = i+1;j>k;j--)//插入新联系人的算法,采用顺利结构
{
strcpy(friends[j].name,friends[j-1].name);
friends[j].sex = friends[j-1].sex;//j+1?
friends[j].births.year = friends[j-1].births.year;
friends[j].births.month = friends[j-1].births.month;
friends[j].births.day = friends[j-1].births.day;
strcpy(friends[j].addrs.post_num,friends[j-1].addrs.post_num);
strcpy(friends[j].addrs.addrs,friends[j-1].addrs.addrs);
strcpy(friends[j].telphone,friends[j-1].telphone);
}
data_input(k);
i++;
break;
case '6':
data_save();
//exit(0);
break;
case '7':
printf("\n\tDO YOU WANT TO SAVE E_NOTE(Y/N):");
ch = getch();
if(ch = 'y')
{
data_save();
fclose(fp);
//exit(0);
}

//default:
//printf("PELASE CHOOSE NUM 1-4 !\n");
}
}while(1);
}



[解决办法]

#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <string.h>

struct addr//定义地址结构体
{
char post_num[10];//邮编
char addrs[40];//地址
};

struct birth //生日结构体
{
int year;
int month;
int day;
};

struct friend1/*通讯录结构定义*/
{
int number;//序号
char name[20];//名字
char sex;//性别
struct birth births;//出生日期
struct addr addrs;//地址
char telphone[13];//电话
}friends[50];

FILE *fp;//定义文件指针*fp
int i;
void Data_Load()//读取通讯录
{
int j;
long k;
fp = fopen("friend.txt","r+t");
if (fp != NULL)//文件已经存在时
{
for (i = 1;i<50;i++)//循环的写入每一条记录
{
if (j = fgetc(fp) == EOF)//判断是否到了文件尾部
return;
k = i-1;


fseek(fp,k*sizeof(struct friend1),SEEK_SET);
fread(&friends[i],sizeof(struct friend1),1,fp);
}
}
else//文件不存在,创新新文件
{
fp = fopen("friend.txt","w");
i = 1;
}
}

void Data_Show(int j)//显示信息
{
printf("\n\n\tNO.:%3d\n",friends[j].number);
printf("\n\n\tNAME:%-20s\n\t性别:%c\n",friends[j].name,friends[j].sex);
printf("\n\tBIRTHDAY:%4d%2d%2d",friends[j].births.year,friends[j].births.month,friends[j].births.day);
printf("\n\tPOST NUMBER:%-10s",(friends[j].addrs).post_num);
printf("\n\tADDRESS:%-40s",friends[j].addrs.addrs);
printf("\n\tTELPHONE:%-13s",friends[j].telphone);
}

void data_input(int j)//j代表新增的信息的序号
{
fflush(stdin);
friends[j].number = j;
printf("\n\n\n\tNO. %d RECORD",j);
printf("\n\n\tNAME:");
scanf("%s",friends[j].name);
getchar();//首先这个地方要加一个getchar()语句,接收回车符
printf("\n\n\tSEX(M/F):");
scanf("%c",&friends[j].sex);//由于friends[j].sex是字符类型 不是字符数组,
//所以要用取地址符,不要写成%s,单个字符是%c
printf("\n\n\tBIRTHDAY:");
printf("\n\t\tYEAR:");
scanf("%d",friends[j].births.year);//注意输入的类型为整形 往下依次类推就对了
printf("\n\t\tMONTH:");
scanf("%d",friends[j].births.month);
printf("\n\t\tDAY:");
scanf("%d",friends[j].births.day);
printf("\n\tPOST NUMBER:");
scanf("%s",friends[j].addrs.post_num);
printf("\n\tADDRESS:");
scanf("%s",friends[j].addrs.addrs);
printf("\n\tTELPHONE:");
scanf("%s",friends[j].telphone);
}

void data_save()//存档
{
int j;
fp = fopen("friend.txt","w");
for(j = 1;j<i;j++)
{
fwrite(&friends[j],sizeof(struct friend1),1,fp);
}

}

main()
{
int j,k;
char ch;
char *search_name;
//clrser();
Data_Load();
i--;
do
{
printf("\n\n\n\tCHOOSE:");
printf("\n\t1.READ");
printf("\n\t2.APPEND");
printf("\n\t3.DELETE");
printf("\n\t4.SEARCH");
printf("\n\t5.INSERT");
printf("\n\t6.SAVE AND EXIT");
printf("\n\t7.QUIT");
printf("\n\n");
printf("\tCHOOSE:");
ch = getche();
switch(ch)
{
case '1':
j = 1;
while(getche()&&j<= 1)
{
Data_Show(j++);
}
if(j>i)
{
printf("\n\nEnd of e_note\n");
}
break;
case '2':
while(getche() != 0x1b&&i<50)//0x1b为ESC按键的16进制码
{
i++;
data_input(i);
}
if (i == 50)
{
printf("\n\te_note is filled\n");
}
break;
case '3':
if (i<1)
{
printf("\n\tNO SUCH RECORD!\n");
break;
}
printf("\n\t INPUT THE NO:");//读取删除的位置
scanf("%d",&k);
for (j = k;j<i;j++)//删除记录的算法,即将后面的数据项整体前移一格
{
strcpy(friends[j].name,friends[j+1].name);
friends[j].sex = friends[j+1].sex;
friends[j].births.year = friends[j+1].births.year;
friends[j].births.month = friends[j+1].births.month;
friends[j].births.day = friends[j+1].births.day;
strcpy(friends[j].addrs.post_num,friends[j+1].addrs.post_num);
strcpy(friends[j].addrs.addrs,friends[j+1].addrs.addrs);
strcpy(friends[j].telphone,friends[j+1].telphone);
}
i--;//记录的总数减一
break;
case '4'://查找联系人
printf("\n\t INPUT NAME:");
gets(search_name);
for (j = 1;j<i;j++)


{
if (strcmp(search_name,friends[j].name) == 0)//用字符串比较来判断是否找到了所需的元素项
{
Data_Show(j);//显示记录
break;
}
}
if (j>i)//查找失败时
{
printf("\n\t NO RECORD !");
}
break;
case '5'://插入新联系人
printf("\n\tInsert NO:");//选择插入的序号
scanf("%d",&k);
for (j = i+1;j>k;j--)//插入新联系人的算法,采用顺利结构
{
strcpy(friends[j].name,friends[j-1].name);
friends[j].sex = friends[j-1].sex;//j+1?
friends[j].births.year = friends[j-1].births.year;
friends[j].births.month = friends[j-1].births.month;
friends[j].births.day = friends[j-1].births.day;
strcpy(friends[j].addrs.post_num,friends[j-1].addrs.post_num);
strcpy(friends[j].addrs.addrs,friends[j-1].addrs.addrs);
strcpy(friends[j].telphone,friends[j-1].telphone);
}
data_input(k);
i++;
break;
case '6':
data_save();
//exit(0);
break;
case '7':
printf("\n\tDO YOU WANT TO SAVE E_NOTE(Y/N):");
ch = getch();
if(ch = 'y')
{
data_save();
fclose(fp);
//exit(0);
}

//default:
//printf("PELASE CHOOSE NUM 1-4 !\n");
}
}while(1);
}


热点排行
Bad Request.