前提・実現したいこと
C言語で住所録を作成しています。
csvファイルを読み込んだあと、mallocで確保したノードに格納しています。
追加や編集、削除をした後にまたファイルに頭から書き込みなおします。
その際に名前の昇順でソートし保存したいです。
エラー箇所は!!!!!!で囲んだところです。
発生している問題・エラーメッセージ
C6011 NULL ポインター 'head' を逆参照しています。 C28182 NULL ポインターを逆参照しています。'index' には、'head' と同じ NULL 値が含まれます。これが行われる可能性のある以前の行 118 を参照してください C4133 '=': 'data *' と 'data *' の間で型に互換性がありません。
該当のソースコード
[address.3.h] #ifndef _ADDRESS3_H_ #define _ADDRESS3_H_ #define NAME_SIZE 100 #define TEL_SIZE 100 #define ADDRESS_SIZE 100 typedef struct { char name[NAME_SIZE+1]; //名前 char tel[TEL_SIZE +1]; //電話番号 char address[ADDRESS_SIZE +1]; //住所 struct data *next; //次のデータへのポインタ }data; void file_read(); void file_write(data*, data*); #endif [address.3.c] #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include "address3.h" static char Title[] = "名前,電話番号,住所\n"; static char delm[] = "-------------------------\n"; data* head = NULL; data* tail = NULL; data* p = NULL; void file_read() //ファイル読込 { FILE* fp; char str[300] = { 0 }; char* sp, * ep; int count = 0; printf(delm); printf("ファイルを読み込みます。\n"); fp = fopen("address3.csv", "r"); if (fp == NULL) { printf("ファイルを開けませんでした。\n"); return; } printf(delm); fgets(str, sizeof(str), fp); //Title printf("%s", str); while (1) { p = (data*)malloc(sizeof(data) * 1000); if (p == NULL) { printf("メモリ確保エラー\n"); break; } fgets(str, sizeof(str), fp); //配列strに一行ずつ読み込む if (feof(fp)) break; sp = str; if ((ep = strchr(str, ',')) != NULL) { *ep = '\0'; strcpy(p->name, sp); printf("%s,", p->name); sp = ep + 1; if ((ep = strchr(sp, ',')) != NULL) { *ep = '\0'; strcpy(p->tel, sp); printf("%s,", p->tel); sp = ep + 1; if ((ep = strchr(sp, '\n')) != NULL) { *ep = '\0'; strcpy(p->address, sp); printf("%s \n", p->address); } } } p->next = NULL; if ((head == NULL) && (tail == NULL)) { head = p; tail = p; } else { !!!!!!!!!!!tail->next = p;!!!!!!!!!!!!!!!!!!!!!!!!! tail = p; // } tail->next = NULL; } fclose(fp); free(p); } void file_write(data* head, data* tail)//ファイル保存 { FILE* fp; int peopleCnt = 1, count = 0, count2 = 0; data* temp = { 0 }; data* current; data* index; data* index2=0; printf(delm); printf("ファイルへ保存します。\n"); fp = fopen("address3.csv", "w"); if (fp == NULL) { printf("ファイルを開けませんでした。\n"); return; } puts(delm); puts(Title); fputs(Title, fp); if (head == NULL) { printf("登録がありません。\n"); } //名前の昇順で保存 while(index2==NULL) { index = head; !!!!!!!!!index2 = head->next;!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!if (strcmp(index->name, index2->name) > 0)!!!!!!!!!! { temp = index2; index2= index; index = temp; } printf("%s,%s,%s\n", index->name, index->tel, index->address); fprintf(fp, "%s,%s,%s\n", index->name, index->tel, index->address); } fclose(fp); }
補足情報(FW/ツールのバージョンなど)
visualstudio2019
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/14 05:02 編集