前提
C言語の勉強で構造体を使ったアドレス帳のようなプログラムを作成しています。
問題ではデータ1件ごとにmallocを使用してメモリの動的確保を行わないといけないため
add_data関数に入る前に一度mallocを使用していますadd_data関数自体は問題なくうごいていますがデータ一覧を表示すると直近で追加したデータ以外おかしな表示がされてしまいます
なぜこのようになるのかわからなく相談させていただきました。
mallocであたらしいメモリの割り当てを取っているつもりでしたがとれていないのでしょうか?
それとも、そもそもの所これだと追加できていないのでしょうか?
少しヒントをいただければ幸いです
発生している問題・エラーメッセージ
仮に3件追加した場合 No.1 名前: 住所: 生年月日: 電話番号: No.2 名前: 住所: 生年月日: 電話番号: No.3 名前:太郎 住所:日本 生年月日:2023/04/28 電話番号:090-1234-5678 3件目は保存されていますが1.2件目は例のため空白になっていますが おかしな文字列が入っていたりします
該当のソースコード
C言語
1ソースコード 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5 6typedef struct { 7 char name[22]; 8 char address[130]; 9 char birth[12]; 10 char tell[18]; 11}kojin; 12 13void show_data(kojin *data, int size); 14//void search_data(struct kojin *data); 15void add_data(kojin *data, int size); 16//void change_data(); 17//void delete_data(); 18 19 20int main(void) 21{ 22 kojin *data = NULL; 23 int size = 0; 24 int moji; 25 int i; 26 27 while(1) 28 { 29 printf("-----メニュー-----\n"); 30 printf("1. データ一覧\n"); 31 printf("2. データ一件\n"); 32 printf("3. データの追加\n"); 33 printf("4. データの変更\n"); 34 printf("5. データの削除\n"); 35 printf("6. 終了\n"); 36 printf("\n"); 37 38 moji = getchar(); 39 while (getchar() != '\n'); 40 41 switch (moji) 42 { 43 case '1': 44 printf("1. データ一覧\n"); 45 show_data(data, size); 46 break; 47 48 case '2': 49 printf("2. データ一件閲覧\n"); 50 break; 51 52 case '3': 53 printf("3. データ追加\n"); 54 data = (kojin *)malloc((size + 1) * sizeof(kojin)); 55 if (data == NULL) 56 { 57 printf("メモリの確保に失敗しました。\n"); 58 } 59 add_data(data, size); 60 size++; 61 break; 62 63 case '4': 64 printf("4. データ変更\n"); 65 break; 66 67 case '5': 68 printf("5. データ削除\n"); 69 break; 70 71 case '6': 72 printf("6. 終了します\n"); 73 free(data); 74 exit(0); 75 76 default: 77 printf("入力エラー\n"); 78 } 79 } 80} 81 82void add_data(kojin *data, int size) 83{ 84 int input; 85 int i, j; 86 int flag = 0; 87 88 while(1) 89 { 90 printf("名前の入力\n"); 91 j = 0; 92 while ((input = getchar()) != '\n') 93 { 94 data[size].name[j] = input; 95 j++; 96 } 97 if (j > 0) 98 { 99 data[size].name[j] = '\0'; 100 break; 101 } 102 printf("名前は必須の入力欄になります。\n"); 103 } 104 105 printf("住所の入力\n"); 106 j = 0; 107 while ((input = getchar()) != '\n') 108 { 109 data[size].address[j] = input; 110 j++; 111 } 112 data[size].address[j] = '\0'; 113 114 while (1) 115 { 116 printf("生年月日入力\n"); 117 j = 0; 118 flag = 0; 119 while ((input = getchar()) != '\n') 120 { 121 if (input >= '0' && input <= '9' || input == '/') 122 { 123 data[size].birth[j++] = input; 124 } 125 else 126 { 127 flag = 2; 128 } 129 } 130 if (flag == 0) 131 { 132 data[size].birth[j] = '\0'; 133 break; 134 } 135 else 136 { 137 printf("入力エラー\n"); 138 } 139 } 140 141 while (1) 142 { 143 printf("電話番号を入力\n"); 144 j = 0; 145 flag = 0; 146 while ((input = getchar()) != '\n') 147 { 148 if (input >= '0' && input <= '9' || input == '-') 149 { 150 data[size].tell[j++] = input; 151 } 152 else 153 { 154 flag = 2; 155 } 156 } 157 if (flag == 0) 158 { 159 data[size].tell[j] = '\0'; 160 break; 161 } 162 else 163 { 164 printf("入力エラー\n"); 165 } 166 } 167 printf("-----入力内容-----\n"); 168 printf("名前:%s\n", data[size].name); 169 printf("住所:%s\n", data[size].address); 170 printf("生年月日:%s\n", data[size].birth); 171 printf("電話番号:%s\n", data[size].tell); 172 printf("\n"); 173} 174 175void show_data(kojin *data, int size) 176{ 177 if (size == 0) 178 { 179 printf("データはありません。\n"); 180 return; 181 } 182 183 printf("-----データ一覧-----\n"); 184 for (int i = 0; i < size; i++) 185 { 186 printf("No.%d\n", i+1); 187 printf("名前:%s\n", data[i].name); 188 printf("住所:%s\n", data[i].address); 189 printf("生年月日:%s\n", data[i].birth); 190 printf("電話番号:%s\n", data[i].tell); 191 printf("\n"); 192 } 193} 194 195 196
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/04/28 13:46
2023/04/29 16:56 編集
2023/04/29 14:04