ダウンロードしたプログラムでエラーが出て実行できない。
元々エラーの出る質問プログラムでした。
修正しながらうまくいきましたというコメントがありましたが、
私はうまくいきませんでしたので
main関数は修正して実行しています。コンパイラはMinGwです。
実行結果を下のほうに掲載してあります。
"address.csv"をメニュー4dumpで参照すると文字化けしています。
numberの切り出しに失敗しました。とあるので、これが影響していそうなのですが
コードの直し方がわかりません。よろしくお願いします。
"address.csv"以下です。
yamasita,fuse,090-7777,mail-6
hosi,nagoya,5436,f-mail
kato,kanagawa,080-8888,mail1-2
naka,kamikosaka,080-4444,mail1-1
nasi,oosaka,6789,h-mail
sato,tokyo ,090-3333,mail1-4
suzuki,saitama,090-2222,mail1-5
コード // http://dixq.net/forum/viewtopic.php?t=9744&p=78652 #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 256 struct address{ //アドレス帳のデータ char name[32]; char addre[128]; char number[12]; char mail[64]; struct address* next; //次の要素へのポインタ }; /*プロトタイプ宣言*/ void data_show(struct address* head); void data_add(struct address* head); void data_delete(struct address* head); void data_sort(struct address* head); void data_write(struct address* head); int main(void){ struct address* head=NULL,*p; FILE* fp; static char name[N], addre[N], number[N], mail[N]; //int c; fp = fopen("address.csv","r"); if(fp==NULL){ printf("file not open\n"); exit(1); } char ch[512]; while(fscanf(fp,"%s",ch)!=EOF){ p = (struct address*)malloc(sizeof(struct address)); char* token=","; char* s; s = strtok(ch, token); if ( s != NULL ) { strcpy(name, s); } else { printf( "nameの切り出しに失敗しました。\n"); break; } s = strtok(NULL, token); if ( s != NULL ) { strcpy(addre, s); } else { printf( "addreの切り出しに失敗しました。\n"); break; } s = strtok(NULL, token); if ( s != NULL ) { strcpy(number, s); } else { printf( "numberの切り出しに失敗しました。\n"); break; } s = strtok(NULL, token); if ( s != NULL ) { strcpy(mail, s); } else { printf( "mailの切り出しに失敗しました。\n"); break; } //strcpy(p->name ,strtok(ch,token)); //strcpy(p->addre ,strtok(NULL,token)); //strcpy(p->number ,strtok(NULL,token)); //strcpy(p->mail ,strtok(NULL,token)); p->next = head; head = p; } p = head; printf("\n"); fclose(fp); int select; while(select != 0){ printf("1:ソ\ート 2:削除 3:追加 4:参照 0:終了\nメニューを選択してください:"); scanf("%d",&select); switch(select){ case 1: data_sort(head); break; case 2: data_delete(head); break; case 3: data_add(head); break; case 4: data_show(head); break; case 0: printf("終了します\n"); break; default: printf("もう一度選択してください\n"); break; } } return 0; } //データの追加する関数 void data_add(struct address* head){ struct address* p, *q, *new; char new_name[32]; char new_addre[128]; char new_number[12]; char new_mail[64]; printf("追加する要素を入力してください"); printf("名前:"); scanf("%s",new_name); printf("住所:"); scanf("%s",new_addre); printf("電話番号:"); scanf("%s",new_number); printf("メールアドレス:"); scanf("%s",new_mail); p = head->next; q = head; while(p != NULL){ q = p; p = p->next; } new = (struct address*)malloc(sizeof(struct address)); strcpy(new->name,new_name); strcpy(new->addre,new_addre); strcpy(new->number,new_number); strcpy(new->mail,new_mail); new->next = p; q->next = new; q = head; data_write(q); } void data_delete(struct address* head){ char name[32]; struct address* p, *before; printf("アドレスを削除します\n名前を入力してください:"); scanf("%s", name); p = head; int flag = 0; while(p != NULL && strcmp(p->name,name)!=0){ before = p; p = p->next; flag = 1; printf("a\n"); } printf("%s\n",p->name); if(flag==0 && strcmp(p->name,name) == 0){ head = p->next; p = head; printf("アドレスを削除しました\n"); data_write(p); } else if(p == NULL){ printf("アドレスに登録されていません\n"); }else{ before->next = p->next; p = head; printf("アドレスを削除しました\n\n"); data_write(p); } } //データを参照する関数 void data_show(struct address* head){ struct address* p = head; while(p){ printf("%s,%s,%s,%s\n",p->name,p->addre,p->number,p->mail); p = p->next; } printf("\n"); } //データソート関数 void data_sort(struct address* head){ struct address* p,*before,*after; p = head; after = head->next; if(strcmp(p->name,after->name) > 0){ p = after; p->next = head; p->next->next = after->next; } before = p; p = p->next; after = p->next; while(before){ before = p; p = p->next; after = p->next; } printf("ソ\ートしました\n"); } //ファイルに書き込む関数 void data_write(struct address* p){ FILE* fp2; //struct address* tmp; fp2 = fopen("new_address.csv","w"); if(fp2==NULL){ printf("file not open\n"); exit(1); } while(p){ fprintf(fp2,"%s,%s,%s,%s\n",p->name,p->addre,p->number,p->mail); p = p->next; } fclose(fp2); } /* 実行結果 naka@naka ~/kadai $ gdb a.exe ......省略しています。エラー箇所 while(fscanf(fp,"%s",ch)!=EOF){ (gdb) 40 p = (struct address*)malloc(sizeof(struct address)); (gdb) 42 char* token=","; (gdb) 45 s = strtok(ch, token); (gdb) 46 if ( s != NULL ) { (gdb) 47 strcpy(name, s); (gdb) 53 s = strtok(NULL, token); (gdb) 54 if ( s != NULL ) { (gdb) 55 strcpy(addre, s); (gdb) 61 s = strtok(NULL, token); (gdb) 62 if ( s != NULL ) { (gdb) 63 strcpy(number, s); (gdb) 69 s = strtok(NULL, token); (gdb) 70 if ( s != NULL ) { (gdb) 71 strcpy(mail, s); (gdb) 81 p->next = head; (gdb) 82 head = p; (gdb) 39 while(fscanf(fp,"%s",ch)!=EOF){ (gdb) 40 p = (struct address*)malloc(sizeof(struct address)); (gdb) 42 char* token=","; (gdb) 45 s = strtok(ch, token); (gdb) 46 if ( s != NULL ) { (gdb) 47 strcpy(name, s); (gdb) 53 s = strtok(NULL, token); (gdb) 54 if ( s != NULL ) { (gdb) 55 strcpy(addre, s); (gdb) 61 s = strtok(NULL, token); (gdb) 62 if ( s != NULL ) { (gdb) 65 printf( "numberフリoオノクsオワオスB\n"); (gdb) numberの切り出しに失敗しました。 66 break; (gdb) 85 p = head; (gdb) 86 printf("\n"); (gdb) 88 fclose(fp); (gdb) 91 while(select != 0){ (gdb) 92 printf("1:\[g 2: 3:ヌチ 4:Qニ 0:Iケ\nj[Iオトュセウ「F"); (gdb) 1:ソート 2:削除 3:追加 4:参照 0:終了 メニューを選択してください:93 scanf("%d",&select); (gdb) クAツ・ツ0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[]^_`abcdefghijklmnopqrstuvwxyz{|}~ 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ 1,hijklmnopqrstuvwxyz[]^_`abcdefghijklmnopqrstuvwxyz{|}~ 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ 1,ネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ 1,ヤユヨラリルレロワン゙゚ 1 クAツ・ツ,,ミムメモヤユヨラリルレロワン゙゚ ,ワン゙゚ クAツ・ツ・・・ , ,, クAツ・ツ,C:\MinGW\msys\1.0\home\nakamura\kadai*,・・・・・・・・・・・・x*ツ・ン〔・,・・・・・・x*ツ・ン〔・ クAツ・ツ,tail,, 1:ソート 2:削除 3:追加 4:参照 0:終了 メニューを選択してください: 。 1:ソート 2:削除 3:追加 4:参照 0:終了 メニューを選択してください:4 クAツ・ツ0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[]^_`abcdefghijklmnopqrstuvwxyz{|}~ 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ 1,hijklmnopqrstuvwxyz[]^_`abcdefghijklmnopqrstuvwxyz{|}~ 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ 1,ネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ 1,ヤユヨラリルレロワン゙゚ 1 クAツ・ツ,,ミムメモヤユヨラリルレロワン゙゚ ,ワン゙゚ クAツ・ツ・・・ , ,, クAツ・ツ,C:\MinGW\msys\1.0\home\nakamura\kadai*,・・・・・・・・・・・・x*ツ・ン〔・,・・・・・・x*ツ・ン〔・ クAツ・ツ,tail,, 1:ソート 2:削除 3:追加 4:参照 0:終了 メニューを選択してください: */
回答3件
あなたの回答
tips
プレビュー