質問するログイン新規登録

質問編集履歴

3

改行文字訂正

2016/11/03 06:26

投稿

dec5798
dec5798

スコア74

title CHANGED
File without changes
body CHANGED
@@ -14,6 +14,7 @@
14
14
  以上ですよろしくお願い致します。
15
15
  -----------------------------------------------------------
16
16
  ```c
17
+
17
18
  #define _CRT_SECURE_NO_WARNINGS
18
19
  #define MAX_LINE 5
19
20
  #define MAX_DATA 50
@@ -326,4 +327,6 @@
326
327
  getchar();
327
328
  return;
328
329
  }
329
- }
330
+ }
331
+
332
+ ```

2

改行文字訂正

2016/11/03 06:26

投稿

dec5798
dec5798

スコア74

title CHANGED
File without changes
body CHANGED
@@ -13,7 +13,7 @@
13
13
  (動的メモリ確保は190行目付近に有ります)
14
14
  以上ですよろしくお願い致します。
15
15
  -----------------------------------------------------------
16
- ```
16
+ ```c
17
17
  #define _CRT_SECURE_NO_WARNINGS
18
18
  #define MAX_LINE 5
19
19
  #define MAX_DATA 50

1

構造体型配列への動的メモリ確保のプログラムの変更

2016/11/03 06:15

投稿

dec5798
dec5798

スコア74

title CHANGED
File without changes
body CHANGED
@@ -1,45 +1,329 @@
1
+ 先ほどは失礼いたしました
2
+ 質問のプログラムを変えました
1
- 構造体配列の動的メモリ確保の仕方を教えてさい
3
+ 構造体配列の動的メモリ確保について教えてください
2
4
 
3
- 具体的に今困っている前提条件は
4
- どうしてもmallocかcalloc使構造体配列
5
+ 前提条件:mallocかcalloc使用、構造体配列でデータを持つ事
5
- 動的にメモリを確保するプログラムを書く必要が有ります。
6
6
 
7
- 現在の現状は
8
- 構造体型配列へmallocを使いメモリを確保しようと
7
+ 以上の条件下で動的にメモリを確保しようと
9
- 試みました
8
+ 下記プログラムを実行した
9
+ 初期値が0以外になってしまい
10
+ プログラムが誤作動を起こします。
10
11
 
12
+ わからない事:mallocをどのように構造体配列のデータに参照させるか
13
+ (動的メモリ確保は190行目付近に有ります)
14
+ 以上ですよろしくお願い致します。
15
+ -----------------------------------------------------------
11
- <問題>
16
+ ```c
17
+ #define _CRT_SECURE_NO_WARNINGS
18
+ #define MAX_LINE 5
19
+ #define MAX_DATA 50
20
+ #define MAX_NAME_LEN 24
21
+ #define MAX_ANOTHER_NAME_LEN 24
12
- 配列の中身(int型)が0で初期化されないので
22
+ #define MAX_TEL_LEN 18
13
- 問題が発生する。
23
+ #include <stdio.h>
24
+ #include <stdlib.h>
25
+ #include <string.h>
26
+ #include <ctype.h>///////////数字判定用
14
27
 
15
- という状況です。
16
- 下記にサンプルプログラムを記載します。
28
+ /* 顧客住所録構造体 */
29
+ typedef struct tag_CustomerData {
30
+ long lId; // 顧客番号
31
+ char szName[MAX_NAME_LEN + 1]; // 顧客名
32
+ char szAnotherName[MAX_NAME_LEN + 1]; // ふりがな
33
+ char szTel[MAX_TEL_LEN + 1]; // 電話番号
17
34
 
18
- }```c
19
- /*構造体配列の動的なメモリ確保*/
35
+ } CUSTOMER_DATA;
20
36
 
21
- #include <stdio.h>
37
+ void openMenu(int nInputnum);
38
+ void addData(CUSTOMER_DATA head[]);
22
39
 
40
+ int main()
41
+ {
42
+ char str[128];
43
+ int len;
44
+ int nInputnum;//////////登録の天井処理で使う
45
+ int i;
46
+
47
+ while (1) {
23
- typedef struct seiseki {
48
+ system("cls");
49
+ printf("顧客情報がありません。何件分確保しますか?(1 - 50)");
50
+ fgets(str, sizeof(str), stdin);
51
+
52
+ /* 改行文字が含まれているかの確認 */
24
- int no; /* 学生番 */
53
+ /* 改行文字を終端記に置換する */
25
- char name[128]; /* 氏名 */
54
+ /* else時バッファはクリアする */
55
+ if (strchr(str, '\n') != NULL) {
56
+ str[strlen(str) - 1] = '\0';
57
+
58
+ }else{
59
+ while (getchar() != '\n');
60
+ }
61
+ len = strlen(str);
62
+
63
+ str[0] = toupper(str[0]);
64
+ if (len == 1 && str[0] == 'Q') {
65
+ return 0;
66
+ }
26
- int kokugo; /* 国語点数 */
67
+ /* 不正文字混入時はループを抜けるので */
68
+ /* lenとiの差異で分岐させる */
69
+ for (i = 0; i < len; i++) {
70
+ if (!(isdigit(str[i]))) {
71
+ break;
72
+ }
73
+ }
74
+ if (len == 0 || i != len) {
75
+ printf("<<入力範囲にありません>>");
76
+ getchar();
77
+ continue;
78
+ }
79
+
80
+ nInputnum = atoi(str);
81
+ if (!(nInputnum >= 1 && nInputnum <= 50)) {
82
+ printf("<<入力範囲にありません>>");
83
+ getchar();
84
+ continue;
85
+ }
86
+ openMenu(nInputnum);
87
+ return 0;
88
+ }
89
+ }
90
+
91
+ void openMenu(int nInputnum)
92
+ {
93
+ long lId = 0;
94
+ char str[128];
95
+ int len;
96
+ int num;
97
+ int i;
98
+ int nCountup;
99
+ CUSTOMER_DATA *head;
27
100
 
28
- }SEI;
101
+ while (1) {
102
+ system("cls");
103
+ printf("***** 顧客情報管理 *****\n");
104
+ printf("1:登録\n");
105
+ printf("2:一覧表\示\n"); /* '表'文字エスケープ処理で\挿入 */
106
+ printf("3:削除\n");
107
+ printf("4:ファイル出力\n");
108
+ printf("5:終了\n");
109
+ printf("************************\n");
110
+ printf("(処理区分)>");
111
+ fgets(str, sizeof(str), stdin);
29
112
 
30
-
113
+ /* 改行文字が含まれているかの確認 */
114
+ /* 改行文字を終端記号に置換する */
115
+ /* else時バッファはクリアする */
116
+ if (strchr(str, '\n') != NULL) {
117
+ str[strlen(str) - 1] = '\0';
118
+ }else{
119
+ while (getchar() != '\n');
120
+ }
121
+ len = strlen(str);
122
+
123
+ /* 不正文字混入時はループを抜けるので */
124
+ /* lenとiの差異で分岐させる */
125
+ for (i = 0; i < len; i++) {
126
+ if (!(isdigit(str[i]))) {
127
+ break;
128
+ }
129
+ }
130
+ if (len == 0 || i != len) {
131
+ printf("<<入力した文字が不正です>>");
31
- int main()
132
+ getchar();
133
+ continue;
134
+ }
135
+ num = atoi(str);
136
+ if (!(num >= 1 && num <= 5)) {
137
+ printf("<<処理区分エラー>>\n");
138
+ getchar();
139
+ continue;
140
+ }
141
+ switch (num) {
142
+ case 1: addData(head);
143
+ continue;
144
+
145
+ case 2: for (i = 0; i < 128; i++) {
146
+ if (head[i].lId != 0 && head[i].lId != -1) {
147
+ nCountup++;
148
+ };
149
+ }
150
+ if(nCountup == 0){
151
+ printf("表\示するデータがありません\n");
152
+ getchar();
153
+ continue;
154
+ }
155
+ showData(head, nInputnum);
156
+ continue;
157
+
158
+ case 3: for (i = 0; i < 128; i++) {
159
+ if (head[i].lId != 0 && head[i].lId != -1) {
160
+ nCountup++;
161
+ };
162
+ }
163
+ if(nCountup == 0){
164
+ printf("表\示するデータがありません\n");
165
+ getchar();
166
+ continue;
167
+ }
168
+ showData(head, nInputnum);
169
+ continue;
170
+
171
+ case 4: for (i = 0; i < 128; i++) {
172
+ if (head[i].lId != 0 && head[i].lId != -1) {
173
+ nCountup++;
174
+ };
175
+ }
176
+ if(nCountup == 0){
177
+ printf("表\示するデータがありません\n");
178
+ getchar();
179
+ continue;
180
+ }
181
+ //////////
182
+ continue;
183
+
184
+ case 5: return;
185
+ }
186
+ }
187
+ }
188
+
189
+ void addData(CUSTOMER_DATA acList[])
32
190
  {
191
+ int nCountup = 0;
192
+ char achName[128];
193
+ char achAnotherName[128];
194
+ char achTel[128];
33
- SEI *pns;
195
+ int len;
34
- SEI []seito;
196
+ int i;
197
+
35
-
198
+ CUSTOMER_DATA *pnL;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
199
+
36
- if ((pns = (SEI *)malloc(sizeof(SEI))) == NULL) { /* 記憶領域の確保 */
200
+ if ((pnL = (CUSTOMER_DATA *)malloc(sizeof(CUSTOMER_DATA))) == NULL) { /* 記憶領域の確保 */
37
201
  exit(EXIT_FAILURE);
38
202
  }
203
+
204
+ acList = pnL;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
39
205
 
206
+ for (i = 0; i < 128; i++) { /*0の値以外の登録済み及び */
207
+ if (acList[i].lId != 0) { /*削除済みの値はカウントアップする */
40
- seito = pns;
208
+ nCountup++;
209
+ };
210
+ }
211
+
212
+ while (1) {
41
- seito.[0] = {100,"あああ",47}
213
+ system("cls");
214
+ printf("***** 顧客登録画面 *****\n");
215
+ printf("氏名 :");
42
216
 
217
+ fgets(achName, sizeof(achName), stdin);
218
+ if (strchr(achName, '\n') != NULL) {
219
+ achName[strlen(achName) - 1] = '\0';
220
+
221
+ }else{
222
+ while (getchar() != '\n');
223
+ }
224
+ len = strlen(achName);
225
+
226
+ if (len == 0) {
227
+ printf("<<入力した文字が不正です>>\n");
43
- free(pns);
228
+ getchar();
229
+ continue;
230
+ }
231
+ if (len > MAX_NAME_LEN) {
232
+ printf("<<入力した文字の長さが大きすぎます>>\n");
233
+ getchar();
234
+ continue;
235
+ }
236
+ break;
237
+ }
238
+
239
+ while (1) {
240
+ system("cls");
241
+ printf("***** 顧客登録画面 *****\n");
242
+ printf("氏名 :%s\n", achName);
243
+ printf("ふりがな:");
244
+
245
+ fgets(achAnotherName, sizeof(achAnotherName), stdin);
246
+ if (strchr(achAnotherName, '\n') != NULL) {
247
+ achAnotherName[strlen(achAnotherName) - 1] = '\0';
248
+ }else{
249
+ while (getchar() != '\n');
250
+ }
251
+ len = strlen(achAnotherName);
252
+
253
+ if (len == 0) {
254
+ printf("<<入力した文字が不正です>>\n");
255
+ getchar();
256
+ continue;
257
+ }
258
+ if (len > MAX_ANOTHER_NAME_LEN) {
259
+ printf("<<入力した文字の長さが大きすぎます>>\n");
260
+ getchar();
261
+ continue;
262
+ }
263
+ break;
264
+ }
265
+
266
+ while (1) {
267
+ system("cls");
268
+ printf("***** 顧客登録画面 *****\n");
269
+ printf("氏名 :%s\n", achName);
270
+ printf("ふりがな:%s\n", achAnotherName);
271
+ printf("電話番号:");
272
+
273
+ fgets(achTel, sizeof(achTel), stdin);
274
+ if (strchr(achTel, '\n') != NULL) {
275
+ achTel[strlen(achTel) - 1] = '\0';
276
+ }else{
277
+ while (getchar() != '\n');
278
+ }
279
+ len = strlen(achTel);
280
+
281
+ if (len > MAX_TEL_LEN) {
282
+ printf("<<入力した文字の長さが大きすぎます>>\n");
283
+ getchar();
284
+ continue;
285
+ }
286
+
287
+ for (i = 0; i < len; i++) {
288
+ if (achTel[i] == '-' || achTel[i] == '(' || achTel[i] == ')' || achTel[i] == '0'
289
+ || achTel[i] == '1' || achTel[i] == '2' || achTel[i] == '3'
290
+ || achTel[i] == '4' || achTel[i] == '5' || achTel[i] == '6'
291
+ || achTel[i] == '7' || achTel[i] == '8' || achTel[i] == '9') {
292
+ continue;
293
+ }
294
+ break;
295
+ }
296
+ /* 不正文字混入時はループを抜けるので */
297
+ /* lenとiの差異で分岐させる */
298
+ if (len == 0 || i != len) {
299
+ printf("<<入力した文字が不正です>>\n");
300
+ getchar();
301
+ continue;
302
+ }
303
+ /*------------------------------*/
304
+ acList[nCountup].lId = nCountup + 1; /* 顧客番号を構造体に登録する */
305
+ /*------------------------------*/
306
+ for (i = 0; achName[i] != '\0'; i++) { /*------------------------------*/
307
+ acList[nCountup].szName[i] = achName[i]; /* 氏名を構造体に登録する */
308
+ } /*------------------------------*/
309
+ acList[nCountup].szName[i] = '\0';
310
+
311
+ for (i = 0; achAnotherName[i] != '\0'; i++) { /*------------------------------*/
312
+ acList[nCountup].szAnotherName[i] = achAnotherName[i]; /* ふりがなを構造体に登録する */
313
+ } /*------------------------------*/
314
+ acList[nCountup].szAnotherName[i] = '\0';
315
+
316
+ for (i = 0; achTel[i] != '\0'; i++) { /*------------------------------*/
317
+ acList[nCountup].szTel[i] = achTel[i]; /* 電話番号を構造体に登録する */
318
+ } /*------------------------------*/
319
+ acList[nCountup].szTel[i] = '\0';
320
+
321
+ // printf("\n%s%s%s\n", acList[nCountup].szName, acList[nCountup].szAnotherName, acList[nCountup].szTel); ////////////////デバッグ
322
+ // printf("\n%ld%s%s%s\n", acList[0].lId, acList[0].szName, acList[0].szAnotherName, acList[0].szTel); ////////////////デバッグ
323
+ // printf("\n%ld%s%s%s\n", acList[1].lId, acList[1].szName, acList[1].szAnotherName, acList[1].szTel); ////////////////デバッグ
324
+ // printf("\n%ld%s%s%s\n", acList[2].lId, acList[2].szName, acList[2].szAnotherName, acList[2].szTel); ////////////////デバッグ
325
+ printf("\n登録しました。\n");
326
+ getchar();
44
- return 0;
327
+ return;
45
- ```
328
+ }
329
+ }