前提・実現したいこと
C言語を用いて住所登録プログラムを作成しています。
名前・郵便番号・住所・電話番号の配列をそれぞれ作り、これらを引数にした関数を作りました。以下は成功例です。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define SIZE 100 //名前・郵便番号・住所・電話番号を構造体にまとめる typedef struct{ char name[500]; char zipcode[500]; char address[500]; char tel[500]; }Info; //IDの入力を関数化する int InputID(){ int ID = 0; printf("IDは?(1~%d)\n",SIZE); while(ID == 0){ scanf("%d", &ID); if(ID < 1 || SIZE < ID){ ID = 0; printf("IDが正しくありません。再入力して下さい。\n"); }else{ printf("IDの認証に成功しました。\n"); return ID; } } } //名前・郵便番号・住所・電話番号の入力を関数化する void InputInfo(char name[500], char zipcode[500], char address[500], char tel[500]){ printf("名前を入力して下さい。\n"); scanf("%s", name); printf("郵便番号を入力して下さい。(ハイフンなし)\n"); scanf("%s", zipcode); printf("住所を入力してください。\n"); scanf("%s", address); printf("電話番号を入力してください。(ハイフンなし)\n"); scanf("%s", tel); } //名前・郵便番号・住所・電話番号を登録する void Register(char list1[SIZE][500], char list2[SIZE][500], char list3[SIZE][500], char list4[SIZE][500]){ printf("登録したい"); int ID = InputID(); char name[500], zipcode[500], address[500], tel[500]; InputInfo(name, zipcode, address, tel); memcpy(list1[ID],name,sizeof(list1[ID])); memcpy(list2[ID],zipcode,sizeof(list2[ID])); memcpy(list3[ID],address,sizeof(list3[ID])); memcpy(list4[ID],tel,sizeof(list4[ID])); printf("登録に成功しました。\n"); } //IDから個人情報を検索する void Search(char list1[SIZE][500], char list2[SIZE][500], char list3[SIZE][500], char list4[SIZE][500]){ printf("検索したい"); int ID = InputID(); printf("名前:%s\n",list1[ID]); printf("郵便番号:%s\n",list2[ID]); printf("住所:%s\n",list3[ID]); printf("電話番号:%s\n",list4[ID]); } //全データの閲覧 void ListAll(char list1[SIZE][500], char list2[SIZE][500], char list3[SIZE][500], char list4[SIZE][500]){ int i; for(i=1;i<=SIZE;i++){ printf("ID:%dの情報-------------------------------\n",i); printf("名前:%s\n",list1[i]); printf("郵便番号:%s\n",list2[i]); printf("住所:%s\n",list3[i]); printf("電話番号:%s\n",list4[i]); } } //データの削除 void Delete(char list1[SIZE][500], char list2[SIZE][500], char list3[SIZE][500], char list4[SIZE][500]){ int select = 0; printf("削除したいデータの"); int ID = InputID(); printf("データを削除しますか? 1.yes 2.no\n"); while(select != 1 || select != 2){ scanf("%d", &select); if(select == 1){ memset(list1[ID],'\0',strlen(list1[ID])); memset(list2[ID],'\0',strlen(list2[ID])); memset(list3[ID],'\0',strlen(list3[ID])); memset(list4[ID],'\0',strlen(list4[ID])); printf("データを削除しました。\n"); break; }else if(select == 2){ printf("削除を中止しました。\n"); break; }else{ printf("1か2を再入力して下さい。\n"); } } } //メインメニュー int main(){ char NameList[SIZE][500], ZipCodeList[SIZE][500], AddressList[SIZE][500], TelList[SIZE][500]; int Menu = 0; while(Menu != 5){ printf("---------------住所録プログラム--------------\n"); printf("1:登録\n"); printf("2:検索\n"); printf("3:閲覧\n"); printf("4:削除\n"); printf("5:終了\n"); printf("行う操作の番号を入力して下さい。\n"); scanf("%d", &Menu); system("cls"); switch(Menu){ case 1: Register(NameList, ZipCodeList, AddressList, TelList); break; case 2: Search(NameList, ZipCodeList, AddressList, TelList); break; case 3: ListAll(NameList, ZipCodeList, AddressList, TelList); break; case 4: Delete(NameList, ZipCodeList, AddressList, TelList); break; case 5: break; default: printf("不正な番号です。再入力して下さい。\n"); break; } } return 0; }
上記の関数の引数が4つもあり煩雑だと思い、構造体を用いて簡潔にしようと思ったのですが、以下のソースコードを試してみるとRegister関数で情報を登録しましたが、Search関数実行時に表示されません。ポインタの問題だと思ったのですが、C言語を学び始めて2か月の私には解決策が思いつきませんでした。そこで対処法を教えて頂きたいです。
また、ID以外の情報からも検索できるように改良しましたので、誤っている箇所があれば教えて頂きたいです。
初投稿なので拙いですが、ご容赦ください。
宜しくお願い致します。
発生している問題・エラーメッセージ
Register関数で名前・郵便番号・住所・電話番号を入力した後、Search関数で検索しても登録したはずの 4つの情報が出力されない。エラーメッセージは出ない。
該当のソースコード
C
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4#define SIZE 100 5#define LENGTH 500 6 7//名前・郵便番号・住所・電話番号を構造体にまとめる 8typedef struct{ 9 char name[LENGTH]; 10 char zipcode[LENGTH]; 11 char address[LENGTH]; 12 char tel[LENGTH]; 13}Info; 14 15typedef struct{ 16 char NameList[SIZE][LENGTH]; 17 char ZipCodeList[SIZE][LENGTH]; 18 char AddressList[SIZE][LENGTH]; 19 char TelList[SIZE][LENGTH]; 20}InfoList; 21 22//IDの入力を関数化する 23int InputID(){ 24 int ID = 0; 25 printf("IDは?(1~%d)\n",SIZE); 26 while(ID == 0){ 27 scanf("%d", &ID); 28 if(ID < 1 || SIZE < ID){ 29 ID = 0; 30 printf("IDが正しくありません。再入力して下さい。\n"); 31 }else{ 32 printf("IDの認証に成功しました。\n"); 33 return ID; 34 } 35 } 36} 37 38//名前・郵便番号・住所・電話番号の入力 39void InputInfo(Info *info){ 40 printf("名前を入力して下さい。\n"); 41 scanf("%s", info->name); 42 printf("郵便番号を入力して下さい。(ハイフンなし)\n"); 43 scanf("%s", info->zipcode); 44 printf("住所を入力してください。\n"); 45 scanf("%s", info->address); 46 printf("電話番号を入力してください。(ハイフンなし)\n"); 47 scanf("%s", info->tel); 48} 49 50//名前・郵便番号・住所・電話番号の格納 51void SetInfo(InfoList *list, Info *info, int ID){ 52 memcpy(list->NameList[ID],info->name,sizeof(list->NameList[ID])); 53 memcpy(list->ZipCodeList[ID],info->zipcode,sizeof(list->ZipCodeList[ID])); 54 memcpy(list->AddressList[ID],info->address,sizeof(list->AddressList[ID])); 55 memcpy(list->TelList[ID],info->tel,sizeof(list->TelList[ID])); 56} 57 58//ID・名前・郵便番号・住所・電話番号の出力 59void OutputInfo(InfoList *list, int ID){ 60 printf("ID:%d", ID); 61 printf("名前:%s\n",list->NameList[ID]); 62 printf("郵便番号:%s\n",list->ZipCodeList[ID]); 63 printf("住所:%s\n",list->AddressList[ID]); 64 printf("電話番号:%s\n",list->TelList[ID]); 65} 66 67//名前・郵便番号・住所・電話番号の登録 68void Register(InfoList *list){ 69 printf("登録したい"); 70 int ID = InputID(); 71 Info *info; 72 InputInfo(info); 73 SetInfo(list, info, ID); 74 printf("登録に成功しました。\n"); 75} 76 77//個人情報の検索 78void Search(InfoList *list){ 79 int i, ID, cnt = 0; 80 char string[500]; 81 char element[5][10] = {"ID", "名前", "郵便番号", "住所", "電話番号"}; 82 printf("何で検索しますか?\n1.ID 2.名前 3.郵便番号 4.住所 5.電話番号\n"); 83 scanf("%d", &i); 84 while(i<1 || 5<i){ 85 printf("不正な番号です。再入力してください。\n"); 86 printf("何で検索しますか?\n1.ID 2.名前 3.郵便番号 4.住所 5.電話番号\n"); 87 scanf("%d", &i); 88 } 89 if(i == 1){ 90 printf("検索したい"); 91 ID = InputID(); 92 OutputInfo(list, ID); 93 }else{ 94 printf("検索する%sを入力して下さい。\n", element[i]); 95 gets(string); 96 for(ID=1;ID<=SIZE;ID++){ 97 switch(i){ 98 case 2: 99 if(strcmp(list->NameList[ID], string) == 0) OutputInfo(list, ID); 100 break; 101 case 3: 102 if(strcmp(list->ZipCodeList[ID], string) == 0) OutputInfo(list, ID); 103 break; 104 case 4: 105 if(strcmp(list->AddressList[ID], string) == 0) OutputInfo(list, ID); 106 break; 107 case 5: 108 if(strcmp(list->TelList[ID], string) == 0) OutputInfo(list, ID); 109 break; 110 default: 111 cnt += 1; 112 break; 113 } 114 } 115 if(cnt == SIZE) printf("そのような%sは存在しません。\n", element[i]); 116 } 117} 118 119//全データの閲覧 120void ListAll(InfoList *list){ 121 int i; 122 for(i=1;i<=SIZE;i++){ 123 printf("ID:%dの情報-------------------------------\n",i); 124 OutputInfo(list, i); 125 } 126} 127 128//既存のデータを空白に書き換え 129void Blank(InfoList *list, int ID){ 130 memset(list->NameList[ID],'\0',strlen(list->NameList[ID])); 131 memset(list->ZipCodeList[ID],'\0',strlen(list->ZipCodeList[ID])); 132 memset(list->AddressList[ID],'\0',strlen(list->AddressList[ID])); 133 memset(list->TelList[ID],'\0',strlen(list->TelList[ID])); 134} 135 136//データの削除 137void Delete(InfoList *list){ 138 int select = 0; 139 printf("削除したいデータの"); 140 int ID = InputID(); 141 printf("データを削除しますか? 1.yes 2.no\n"); 142 while(select != 1 || select != 2){ 143 scanf("%d", &select); 144 if(select == 1){ 145 Blank(list, ID); 146 printf("データを削除しました。\n"); 147 break; 148 }else if(select == 2){ 149 printf("削除を中止しました。\n"); 150 break; 151 }else{ 152 printf("1か2を再入力して下さい。\n"); 153 } 154 } 155} 156 157//メインメニュー 158int main(){ 159 InfoList *list; 160 int MenuID = 0; 161 while(MenuID != 5){ 162 printf("---------------住所録プログラム--------------\n"); 163 printf("1:登録\n"); 164 printf("2:検索\n"); 165 printf("3:閲覧\n"); 166 printf("4:削除\n"); 167 printf("5:終了\n"); 168 printf("行う操作の番号を入力して下さい。\n"); 169 scanf("%d", &MenuID); 170 system("cls"); 171 switch(MenuID){ 172 case 1: 173 Register(list); 174 break; 175 case 2: 176 Search(list); 177 break; 178 case 3: 179 ListAll(list); 180 break; 181 case 4: 182 Delete(list); 183 break; 184 case 5: 185 break; 186 default: 187 printf("不正な番号です。再入力して下さい。\n"); 188 break; 189 } 190 191 } 192 return 0; 193} 194
試したこと
InfoとInfoListをポインタ型にしたり、アロー演算子を用いて構造体メンバを取り出そうとした。
補足情報(FW/ツールのバージョンなど)
Visual Studioを用いてgccでコンパイラした。
回答2件
あなたの回答
tips
プレビュー