アドレスのアクセス違反について自力で解決を試みましたが、解決できず困っております。どうすれば解決できるでしょうか?
あるプログラムをデバックすると「matome_k.c.exe の 0x1026f824 (msvcr90d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000031 を読み込み中にアクセス違反が発生しました。」という警告文が表示されます。
見づらいかと思いますが、一応、ソースコードも貼り付けておきます。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 256
/*メインモジュール*/
int main (void)
{
//youso = YOUSO();/*要素数モジュールを呼び出し*/
struct input{
char number; /*部門コード*/
char comma1; /*カンマ*/
char name[7]; /*商品名*/
char comma2; /*カンマ*/
}a[50];
/*ファイルに出力するための構造体*/
struct output{
char name1[7]; /*商品名*/
char comma1[2]; /*カンマ(予め固定長分の半角スペースで初期化)*/
char name2[7] ; /*商品名*(予め固定長分の半角スペースで初期化)*/
char comma2[2]; /*カンマ(予め固定長分の半角スペースで初期化)*/
char name3[7]; /*商品名(予め固定長分の半角スペースで初期化)*/
}data1;
int ii =0;
int count1 =0,count2=0;
char buffer1[100][30],buffer2[100][30];
int kk; /*添え字に使用*/
char comma2 =','; /*コンマ*/
int jj; /*添え字に使用*/
char comma1 =','; /*コンマ*/
FILE *fp1;
FILE *fp2;
FILE *fp3;
fp1 = fopen("list_input.txt","r");
if( fp1 == NULL)
{
fprintf(stderr, "Error : File is not open \n");
exit(1);
//エラー処理
}
while(fread(&a[ii].number,1,1,fp1) != NULL){ /* 部門コードがある間データを読み込む */
fread(&a[ii].comma1,1,1,fp1); /* カンマ */
fread(&a[ii].name,6,1,fp1);/* 商品名 */
fread(&a[ii].comma2,1,1,fp1); /*カンマまたは改行*/
printf("%c",a[ii].number);
if(strcmp(a[ii].number, "1") == 0) /*部門コードの確認*/
{
/*部門コード1*/
strcpy(buffer1[count1],a[ii].name);/*部門コード1の商品名格納*/
count1++; /*次に格納する配列へ移動*/
}else if(strcmp(a[ii].number,"2") == 0)
{
/*部門コード2*/
strcpy(buffer2[count2],a[ii].name);/*部門コード2の商品名格納*/
count2++; /*次に格納する配列へ移動*/
}else{
printf("ERROR:判定不能な部門コードが検出されました。\a\n"); /*判定不能な部門コードが検出された場合、エラーメッセージを表示し強制終了する*/
exit(1);
}
ii++; /*次のデータへ移動*/
}
fp2 = fopen("list1.txt","w");
if( fp2 == NULL)
{
fprintf(stderr, "Error : File is not open \n");
exit(1);
// エラー処理
}
for(jj=0;buffer1[jj][0]!=NULL;){ /*データが在るまで続ける*/
sprintf(data1.name1,"%s",buffer1[jj++]);/* 商品名を挿入 */
if(buffer1[jj][0] != NULL){ /*次のデータの確認*/
sprintf(data1.comma1,"%c",comma1); /*次のデータがあった場合カンマを入れる*/
sprintf(data1.name2,"%s",buffer1[jj++]);/*商品名を挿入*/
}
if(buffer1[jj][0] != NULL){ /*次のデータの確認*/
sprintf(data1.comma2,"%c",comma1); /*次のデータがあった場合カンマを入れる*/
sprintf(data1.name3,"%s",buffer1[jj++]);/*商品名を挿入*/
}
fputs(data1.name1,fp2);/*商品名をファイルへ出力*/
fputs(data1.comma1,fp2);/*カンマまたはスペースをファイルへ出力*/
fputs(data1.name2,fp2);/*商品名またはスペースをファイルへ出力*/
fputs(data1.comma2,fp2);/*カンマまたはスペースをファイルへ出力*/
fputs(data1.name3,fp2);/*商品名またはスペースをファイルへ出力*/
fputc('\n',fp2); /*改行をファイルへ出力*/
}
fputs(fp2,"%d",jj); /*品種数を出力ファイル1へ出力*/
fclose(fp2); /*ファイルを閉じる*/
fp3 = fopen("list2.txt","w");
if( fp3 == NULL)
{
fprintf(stderr, "Error : File is not open \n");
exit(1);
// エラー処理
}
for(kk=0;buffer2[kk][0]!=NULL;){ /*データが在るまで続ける*/
sprintf(data1.name1,"%s",buffer2[kk++]);/* 商品名を挿入 */
if(buffer2[kk][0] != NULL)
{ /*次のデータの確認*/
sprintf(data1.comma1,"%c",comma2); /*次のデータがあった場合カンマを入れる*/
sprintf(data1.name2,"%s",buffer2[kk++]);/*商品名を挿入*/
}
if(buffer2[kk][0] != NULL)
{ /*次のデータの確認*/
sprintf(data1.comma2,"%c",comma2); /*次のデータがあった場合カンマを入れる*/
sprintf(data1.name3,"%s",buffer2[kk++]);/*商品名を挿入*/
}
fprintf(fp3,"%s",data1.name1);/*商品名をファイルへ出力*/
fprintf(fp3,"%s",data1.comma1);/*カンマまたはスペースをファイルへ出力*/
fprintf(fp3,"%s",data1.name2);/*商品名またはスペースをファイルへ出力*/
fprintf(fp3,"%s",data1.comma2);/*カンマまたはスペースをファイルへ出力*/
fprintf(fp3,"%s",data1.name3);/*商品名またはスペースをファイルへ出力*/
fputc('\n',fp3); /*改行をファイルへ出力*/
}
fprintf(fp3,"%d\n",kk); /*品種数を出力ファイル1へ出力*/
fclose(fp3); /*ファイルを閉じる*/
fclose(fp1);
return (0);
}