前提・実現したいこと
C言語を始めて3か月の初心者です。
住所録プログラムを作成しています。
以下のソースコードで、Register関数を用いてファイルmemo.txtに入力した文字列配列をSearch関数で検索(出力)すると正しく表示されません。次のように出力するためにはどう修正したら良いのでしょうか。
宜しくお願い致します。
memo.txtの内容:
A0000000placeA0000000000 B1111111placeB1111111111 C2222222placeC2222222222
以下のように表示したい:
検索したいIDは?(1~100) 1 IDの認証に成功しました。 名前:A 郵便番号:0000000 住所:placeA 電話番号:00000000000 検索したいIDは?(1~100) 2 IDの認証に成功しました。 名前:B 郵便番号:1111111 住所:placeB 電話番号:1111111111 検索したいIDは?(1~100) 3 IDの認証に成功しました。 名前:C 郵便番号:2222222 住所:placeC 電話番号:2222222222
宜しくお願い致します。
発生している問題
次のように表示されてしまう。
検索したいIDは?(1~100) 1 IDの認証に成功しました。 ID:1 名前:A0000000placeA0000000000 郵便番号:B1111111placeB1111111111 住所:C2222222placeC2222222222 電話番号:
該当のソースコード
C
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4#include<stdbool.h> 5#define SIZE 100 6#define LENGTH 512 7 8//名前・郵便番号・住所・電話番号を構造体にまとめる 9typedef struct{ 10 char name[LENGTH]; 11 char zipcode[LENGTH]; 12 char address[LENGTH]; 13 char tel[LENGTH]; 14}Info; 15 16typedef Info InfoList[SIZE + 1]; 17 18//IDの入力を関数化する 19int InputID(){ 20 int ID; 21 printf("IDは?(1~%d)\n",SIZE); 22 while(1){ 23 if(scanf("%d", &ID) != 1) exit(1); 24 if(1 <= ID && ID <= SIZE){ 25 printf("IDの認証に成功しました。\n"); 26 return ID; 27 } 28 printf("IDが正しくありません。再入力して下さい。\n"); 29 } 30} 31 32//名前・郵便番号・住所・電話番号の入力 33void InputInfo(Info *info){ 34 printf("名前を入力して下さい。\n"); 35 if(scanf("%s", info->name) != 1) exit(1); 36 printf("郵便番号を入力して下さい。(ハイフンなし)\n"); 37 if(scanf("%s", info->zipcode) != 1) exit(1); 38 printf("住所を入力してください。\n"); 39 if(scanf("%s", info->address) != 1) exit(1); 40 printf("電話番号を入力してください。(ハイフンなし)\n"); 41 if(scanf("%s", info->tel) != 1) exit(1); 42} 43 44//ID・名前・郵便番号・住所・電話番号の出力 45void OutputInfo(InfoList list, int ID, FILE *fp){ 46 printf("ID:%d\n", ID); 47 fscanf(fp, "%s", list[ID].name); 48 fscanf(fp, "%s", list[ID].zipcode); 49 fscanf(fp, "%s", list[ID].address); 50 fscanf(fp, "%s", list[ID].tel); 51 printf("名前:%s\n",list[ID].name); 52 printf("郵便番号:%s\n",list[ID].zipcode); 53 printf("住所:%s\n",list[ID].address); 54 printf("電話番号:%s\n",list[ID].tel); 55} 56 57//名前・郵便番号・住所・電話番号の登録 58void Register(InfoList list, FILE *fp){ 59 fp = fopen("memo.txt", "a"); 60 printf("登録したい"); 61 int ID = InputID(); 62 InputInfo(&list[ID]); 63 fprintf(fp, "%s", list[ID].name); 64 fprintf(fp, "%s", list[ID].zipcode); 65 fprintf(fp, "%s", list[ID].address); 66 fprintf(fp, "%s\n", list[ID].tel); 67 printf("登録に成功しました。\n"); 68} 69 70//個人情報の検索 71void Search(InfoList list, FILE *fp){ 72 fp = fopen("memo.txt", "r"); 73 int select, ID; 74 char *element[] = {"", "ID", "名前", "郵便番号", "住所", "電話番号"}; 75 while(true){ 76 printf("何で検索しますか?\n1.ID 2.名前 3.郵便番号 4.住所 5.電話番号\n"); 77 if(scanf("%d", &select) != 1) exit(1); 78 if(1 <= select && select <= 5) break; 79 printf("不正な番号です。再入力して下さい。\n"); 80 } 81 if(select == 1){ 82 printf("検索したい"); 83 ID = InputID(); 84 OutputInfo(list, ID, fp); 85 return; 86 } 87 printf("検索する%sを入力して下さい。\n", element[select]); 88 char target[512]; 89 if(scanf("%s", target) != 1) exit(1); 90 bool found = false; 91 for(ID=1; ID<=SIZE; ID++){ 92 char *field; 93 switch(select){ 94 case 2: field = list[ID].name; break; 95 case 3: field = list[ID].zipcode; break; 96 case 4: field = list[ID].address; break; 97 case 5: field = list[ID].tel; break; 98 default: break; 99 } 100 if(strcmp(field, target) == 0){ 101 OutputInfo(list, ID, fp); 102 found = true; 103 } 104 } 105 if(!found) printf("そのような%sは存在しません。\n", element[select]); 106} 107 108 109//メインメニュー 110int main(){ 111 FILE *fp; 112 InfoList list; 113 int MenuID = 0; 114 while(MenuID != 5){ 115 printf("---------------住所録プログラム--------------\n"); 116 printf("1:登録\n"); 117 printf("2:検索\n"); 118 printf("3:終了\n"); 119 printf("行う操作の番号を入力して下さい。\n"); 120 if(scanf("%d", &MenuID) != 1) exit(1); 121 system("cls"); 122 switch(MenuID){ 123 case 1: Register(list, fp); break; 124 case 2: Search(list, fp); break; 125 case 3: return 0; 126 default: printf("不正な番号です。再入力して下さい。\n"); break; 127 } 128 } 129 fclose(fp); 130} 131
###回答していただきたいこと
・ターミナルに上記のように正しく表示する方法
・何が間違っているから文字列が正しく表示されないのか
補足情報
VSCodeで作成。gccでコンパイラ。
回答3件
あなたの回答
tips
プレビュー