一用修改功能就出现 内存不能为written,怎么调试呢?
我设计的是财务管理系统,可是用里面一个修改功能的时候中途就会出现”0x00401122“指令引用的"0x00000000"内存。改内存不能为:“written"。大概会在哪里出现问题呢?各位大大指导一下我这位菜鸟// 家庭财务管理功能
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
// 定义家庭财务信息结构体
struct fi_data{
char time[12];
char name[9];
double money;
char detail[11];
};
int Count=0; //定义全局变量,记录收入笔数
void menu(); //菜单函数
void add_income(struct fi_data data[]);
int search_income(struct fi_data data[]);
void delete_income(struct fi_data data[]);
void update_income(struct fi_data data[]);
void sort_income(struct fi_data data[]);
void quit();
void initialize();
void menu()
{
printf("\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t\t 家庭财务管理系统\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t*******************************************\n");
printf("\t\t收入管理:");
printf("1.添加收入");
printf(" 2.查询收入明细\n");
printf("\t\t\t 3.删除收入");
printf(" 4.修改收入\n");
printf(" 5.排序\n");
printf("\t\t0.退出系统");
}
int main(void)
{
int selected, n;
struct fi_data d,data[50]; /*财务数据架构*/
FILE *fp;
//////// 读文件数据
fp = fopen( "fi_info.txt","r" );
if( fp != NULL ) // 打开文件
{
while( !feof( fp ) )
{
int x = fscanf( fp,"%s %s %lf %s",d.time,d.name,&d.money,d.detail);
if( x > 0 ) data[ Count++ ]=d;
else break;
};
fclose( fp );
}
//////////////////
//没写这个主函数的返回类型
system("cls");
do
{
menu();
printf(">请选择要进行的操作(0-4)");
scanf( "%d", &selected );
switch(selected)
{
case 1:add_income(data);break;
case 2:search_income(data);break;
case 3:delete_income(data);break;
case 4:update_income(data);break;
case 5:sort_income(data);break;
case 0:break;
default:
printf(">输入有误!请选择(0-4)之间的数字!...");
break;
}
}while(selected != 0); //-->这里少了条件,我不知道你要什么条件写了一
printf("谢谢使用家庭财务管理系统!\n");
////////// 写文件
fp = fopen( "fi_info.txt","w" );
if( fp != NULL )
{
for( n = 0; n < Count; n++ )
{
d = data[ n ];
fprintf( fp, "%-6s %-10s %-10lf %-10s ", d.time,d.name,d.money,d.detail );
if( n < Count - 1 ) fprintf( fp, "\n" );
};
fclose( fp );
}
//////////
return 0;
}
//增加财务数据
void add_income(struct fi_data data[])
{
struct fi_data d;
printf("请输入年月(例如:2009/1:");
scanf("%s",d.time);
printf("请输入家庭成员姓名:");
scanf("%s",d.name);
printf("输入金额:");
scanf("%lf",&d.money);
printf(">请输入备注(最大长度为%d):",20);
scanf("%s",d.detail);
data[ Count ] = d;
Count++;
}
//修改财务数据
void update_income(struct fi_data data[])
{
int index;
struct fi_data d;
index=search_income(data);
if( index < 0 || index > Count - 1 )
{
printf("没有这个数据!!\n");
return;
}
printf("请输入新的年月:");
scanf("%s",d.time);
printf("请输入家庭成员姓名:");
scanf("%s",d.name);
printf("请输入金额:");
scanf("%s",d.money);
printf("请输入备注:");
scanf("%s",d.detail);
data[Count++]=d;
printf( "\n修改成功!\n" );
}
//删除财务数据
void delete_income(struct fi_data data[])
{
int index,i;
index=search_income(data);
if(index<0||index > Count-1)
{
printf("财务管理系统资料库为空!\n");
return;
}
for(i=index;i<Count-1;i++) data[i]=data[i+1];
Count--;
printf( "删除成功!" );
}
//查询财务数据
int search_income(struct fi_data data[])
{
int i,flag=0,index=-1;
char time[20];
if(Count==0){
printf("财务数据是空的!\n");
return index;
}
printf( "\n请输入查询时间条件:" );
scanf( "%s", time );
for(i=0;i<Count;i++)
{
if( strcmp( time, data[i].time) == 0 )
{
flag=1;
index=i;
break;
}
}
if( index < 0 )
{
printf( "查找不到指定资料!" );
}else
{
printf( "..." );
}
return index;
}
//财务数据排序
void sort_income(struct fi_data data[])
{
int i,j,index;
struct fi_data temp;
//按日期从前到后排序,使用顺序排序法
for(i=0;i<Count-1;i++){
index=i;
for (j=i+1;j<Count;j++)
if(data[j].time<data[index].time) //比较日期的前后
index=j;
temp=data[index];
data[index]=data[i];
data[i]=temp;
}
printf("排序完毕!");
}