質問編集履歴

3

改行文字訂正

2016/11/03 06:26

投稿

dec5798
dec5798

スコア74

test CHANGED
File without changes
test CHANGED
@@ -30,6 +30,8 @@
30
30
 
31
31
  ```c
32
32
 
33
+
34
+
33
35
  #define _CRT_SECURE_NO_WARNINGS
34
36
 
35
37
  #define MAX_LINE 5
@@ -655,3 +657,7 @@
655
657
  }
656
658
 
657
659
  }
660
+
661
+
662
+
663
+ ```

2

改行文字訂正

2016/11/03 06:26

投稿

dec5798
dec5798

スコア74

test CHANGED
File without changes
test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  -----------------------------------------------------------
30
30
 
31
- ```
31
+ ```c
32
32
 
33
33
  #define _CRT_SECURE_NO_WARNINGS
34
34
 

1

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

2016/11/03 06:15

投稿

dec5798
dec5798

スコア74

test CHANGED
File without changes
test CHANGED
@@ -1,89 +1,657 @@
1
+ 先ほどは失礼いたしました
2
+
3
+ 質問のプログラムを変えました
4
+
1
- 構造体配列の動的メモリ確保の仕方を教えてさい
5
+ 構造体配列の動的メモリ確保について教えてください
2
-
3
-
4
-
5
- 具体的に今困っている前提条件は
6
+
6
-
7
+
8
+
7
- どうしてもmallocかcalloc使構造体配列
9
+ 前提条件:mallocかcalloc使用、構造体配列でデータを持つ事
8
-
9
- 動的にメモリを確保するプログラムを書く必要が有ります。
10
+
10
-
11
-
12
-
13
- 現在の現状は
11
+
14
-
12
+
15
- 構造体型配列へmallocを使いメモリを確保しようと
13
+ 以上の条件下で動的にメモリを確保しようと
16
-
17
- 試みましたが
14
+
18
-
19
-
20
-
21
- <問題>
22
-
23
- 配列の中身(int型)が0で初期化されないので
24
-
25
- 問題が発生する。
26
-
27
-
28
-
29
- という状況です。
30
-
31
- 下記にサンルプログラムを記載ます。
15
+ 下記プログラムを実行た所
16
+
32
-
17
+ 初期値が0以外になってしまい
18
+
33
-
19
+ プログラムが誤作動を起こします。
20
+
21
+
22
+
34
-
23
+ わからない事:mallocをどのように構造体配列のデータに参照させるか
24
+
25
+ (動的メモリ確保は190行目付近に有ります)
26
+
27
+ 以上ですよろしくお願い致します。
28
+
29
+ -----------------------------------------------------------
30
+
35
- }```c
31
+ ```
32
+
36
-
33
+ #define _CRT_SECURE_NO_WARNINGS
34
+
35
+ #define MAX_LINE 5
36
+
37
+ #define MAX_DATA 50
38
+
37
- /*構造体配列の動的なメモリ確保*/
39
+ #define MAX_NAME_LEN 24
40
+
38
-
41
+ #define MAX_ANOTHER_NAME_LEN 24
42
+
39
-
43
+ #define MAX_TEL_LEN 18
40
44
 
41
45
  #include <stdio.h>
42
46
 
43
-
47
+ #include <stdlib.h>
48
+
44
-
49
+ #include <string.h>
50
+
51
+ #include <ctype.h>///////////数字判定用
52
+
53
+
54
+
55
+ /* 顧客住所録構造体 */
56
+
45
- typedef struct seiseki {
57
+ typedef struct tag_CustomerData {
58
+
46
-
59
+ long lId; // 顧客番号
60
+
61
+ char szName[MAX_NAME_LEN + 1]; // 顧客名
62
+
63
+ char szAnotherName[MAX_NAME_LEN + 1]; // ふりがな
64
+
65
+ char szTel[MAX_TEL_LEN + 1]; // 電話番号
66
+
67
+
68
+
69
+ } CUSTOMER_DATA;
70
+
71
+
72
+
73
+ void openMenu(int nInputnum);
74
+
75
+ void addData(CUSTOMER_DATA head[]);
76
+
77
+
78
+
79
+ int main()
80
+
81
+ {
82
+
83
+ char str[128];
84
+
85
+ int len;
86
+
87
+ int nInputnum;//////////登録の天井処理で使う
88
+
89
+ int i;
90
+
91
+
92
+
93
+ while (1) {
94
+
95
+ system("cls");
96
+
97
+ printf("顧客情報がありません。何件分確保しますか?(1 - 50)");
98
+
99
+ fgets(str, sizeof(str), stdin);
100
+
101
+
102
+
103
+ /* 改行文字が含まれているかの確認 */
104
+
47
- int no; /* 学生番 */
105
+ /* 改行文字を終端記に置換する */
48
-
106
+
49
- char name[128]; /* 氏名 */
107
+ /* else時バッファはクリアする */
108
+
50
-
109
+ if (strchr(str, '\n') != NULL) {
110
+
111
+ str[strlen(str) - 1] = '\0';
112
+
113
+
114
+
115
+ }else{
116
+
117
+ while (getchar() != '\n');
118
+
119
+ }
120
+
121
+ len = strlen(str);
122
+
123
+
124
+
125
+ str[0] = toupper(str[0]);
126
+
127
+ if (len == 1 && str[0] == 'Q') {
128
+
129
+ return 0;
130
+
131
+ }
132
+
51
- int kokugo; /* 国語点数 */
133
+ /* 不正文字混入時はループを抜けるので */
134
+
135
+ /* lenとiの差異で分岐させる */
136
+
137
+ for (i = 0; i < len; i++) {
138
+
139
+ if (!(isdigit(str[i]))) {
140
+
141
+ break;
142
+
143
+ }
144
+
145
+ }
146
+
147
+ if (len == 0 || i != len) {
148
+
149
+ printf("<<入力範囲にありません>>");
150
+
151
+ getchar();
152
+
153
+ continue;
154
+
155
+ }
156
+
157
+
158
+
159
+ nInputnum = atoi(str);
160
+
161
+ if (!(nInputnum >= 1 && nInputnum <= 50)) {
162
+
163
+ printf("<<入力範囲にありません>>");
164
+
165
+ getchar();
166
+
167
+ continue;
168
+
169
+ }
170
+
171
+ openMenu(nInputnum);
172
+
173
+ return 0;
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+
181
+ void openMenu(int nInputnum)
182
+
183
+ {
184
+
185
+ long lId = 0;
186
+
187
+ char str[128];
188
+
189
+ int len;
190
+
191
+ int num;
192
+
193
+ int i;
194
+
195
+ int nCountup;
196
+
197
+ CUSTOMER_DATA *head;
52
198
 
53
199
 
54
200
 
201
+ while (1) {
202
+
203
+ system("cls");
204
+
205
+ printf("***** 顧客情報管理 *****\n");
206
+
207
+ printf("1:登録\n");
208
+
209
+ printf("2:一覧表\示\n"); /* '表'文字エスケープ処理で\挿入 */
210
+
211
+ printf("3:削除\n");
212
+
213
+ printf("4:ファイル出力\n");
214
+
215
+ printf("5:終了\n");
216
+
217
+ printf("************************\n");
218
+
219
+ printf("(処理区分)>");
220
+
221
+ fgets(str, sizeof(str), stdin);
222
+
223
+
224
+
225
+ /* 改行文字が含まれているかの確認 */
226
+
227
+ /* 改行文字を終端記号に置換する */
228
+
229
+ /* else時バッファはクリアする */
230
+
231
+ if (strchr(str, '\n') != NULL) {
232
+
233
+ str[strlen(str) - 1] = '\0';
234
+
55
- }SEI;
235
+ }else{
236
+
56
-
237
+ while (getchar() != '\n');
238
+
57
-
239
+ }
240
+
58
-
241
+ len = strlen(str);
242
+
243
+
244
+
59
-
245
+ /* 不正文字混入時はループを抜けるので */
246
+
60
-
247
+ /* lenとiの差異で分岐させる */
248
+
249
+ for (i = 0; i < len; i++) {
250
+
251
+ if (!(isdigit(str[i]))) {
252
+
253
+ break;
254
+
255
+ }
256
+
257
+ }
258
+
259
+ if (len == 0 || i != len) {
260
+
261
+ printf("<<入力した文字が不正です>>");
262
+
61
- int main()
263
+ getchar();
264
+
265
+ continue;
266
+
267
+ }
268
+
269
+ num = atoi(str);
270
+
271
+ if (!(num >= 1 && num <= 5)) {
272
+
273
+ printf("<<処理区分エラー>>\n");
274
+
275
+ getchar();
276
+
277
+ continue;
278
+
279
+ }
280
+
281
+ switch (num) {
282
+
283
+ case 1: addData(head);
284
+
285
+ continue;
286
+
287
+
288
+
289
+ case 2: for (i = 0; i < 128; i++) {
290
+
291
+ if (head[i].lId != 0 && head[i].lId != -1) {
292
+
293
+ nCountup++;
294
+
295
+ };
296
+
297
+ }
298
+
299
+ if(nCountup == 0){
300
+
301
+ printf("表\示するデータがありません\n");
302
+
303
+ getchar();
304
+
305
+ continue;
306
+
307
+ }
308
+
309
+ showData(head, nInputnum);
310
+
311
+ continue;
312
+
313
+
314
+
315
+ case 3: for (i = 0; i < 128; i++) {
316
+
317
+ if (head[i].lId != 0 && head[i].lId != -1) {
318
+
319
+ nCountup++;
320
+
321
+ };
322
+
323
+ }
324
+
325
+ if(nCountup == 0){
326
+
327
+ printf("表\示するデータがありません\n");
328
+
329
+ getchar();
330
+
331
+ continue;
332
+
333
+ }
334
+
335
+ showData(head, nInputnum);
336
+
337
+ continue;
338
+
339
+
340
+
341
+ case 4: for (i = 0; i < 128; i++) {
342
+
343
+ if (head[i].lId != 0 && head[i].lId != -1) {
344
+
345
+ nCountup++;
346
+
347
+ };
348
+
349
+ }
350
+
351
+ if(nCountup == 0){
352
+
353
+ printf("表\示するデータがありません\n");
354
+
355
+ getchar();
356
+
357
+ continue;
358
+
359
+ }
360
+
361
+ //////////
362
+
363
+ continue;
364
+
365
+
366
+
367
+ case 5: return;
368
+
369
+ }
370
+
371
+ }
372
+
373
+ }
374
+
375
+
376
+
377
+ void addData(CUSTOMER_DATA acList[])
62
378
 
63
379
  {
64
380
 
381
+ int nCountup = 0;
382
+
383
+ char achName[128];
384
+
385
+ char achAnotherName[128];
386
+
387
+ char achTel[128];
388
+
65
- SEI *pns;
389
+ int len;
66
-
390
+
67
- SEI []seito;
391
+ int i;
392
+
393
+
394
+
68
-
395
+ CUSTOMER_DATA *pnL;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
69
-
70
-
396
+
397
+
398
+
71
- if ((pns = (SEI *)malloc(sizeof(SEI))) == NULL) { /* 記憶領域の確保 */
399
+ if ((pnL = (CUSTOMER_DATA *)malloc(sizeof(CUSTOMER_DATA))) == NULL) { /* 記憶領域の確保 */
72
400
 
73
401
  exit(EXIT_FAILURE);
74
402
 
75
403
  }
76
404
 
77
-
78
-
79
- seito = pns;
80
-
81
- seito.[0] = {100,"あああ",47}
82
-
83
-
84
-
85
- free(pns);
86
-
87
- return 0;
88
-
89
- ```
405
+
406
+
407
+ acList = pnL;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
408
+
409
+
410
+
411
+ for (i = 0; i < 128; i++) { /*0の値以外の登録済み及び */
412
+
413
+ if (acList[i].lId != 0) { /*削除済みの値はカウントアップする */
414
+
415
+ nCountup++;
416
+
417
+ };
418
+
419
+ }
420
+
421
+
422
+
423
+ while (1) {
424
+
425
+ system("cls");
426
+
427
+ printf("***** 顧客登録画面 *****\n");
428
+
429
+ printf("氏名 :");
430
+
431
+
432
+
433
+ fgets(achName, sizeof(achName), stdin);
434
+
435
+ if (strchr(achName, '\n') != NULL) {
436
+
437
+ achName[strlen(achName) - 1] = '\0';
438
+
439
+
440
+
441
+ }else{
442
+
443
+ while (getchar() != '\n');
444
+
445
+ }
446
+
447
+ len = strlen(achName);
448
+
449
+
450
+
451
+ if (len == 0) {
452
+
453
+ printf("<<入力した文字が不正です>>\n");
454
+
455
+ getchar();
456
+
457
+ continue;
458
+
459
+ }
460
+
461
+ if (len > MAX_NAME_LEN) {
462
+
463
+ printf("<<入力した文字の長さが大きすぎます>>\n");
464
+
465
+ getchar();
466
+
467
+ continue;
468
+
469
+ }
470
+
471
+ break;
472
+
473
+ }
474
+
475
+
476
+
477
+ while (1) {
478
+
479
+ system("cls");
480
+
481
+ printf("***** 顧客登録画面 *****\n");
482
+
483
+ printf("氏名 :%s\n", achName);
484
+
485
+ printf("ふりがな:");
486
+
487
+
488
+
489
+ fgets(achAnotherName, sizeof(achAnotherName), stdin);
490
+
491
+ if (strchr(achAnotherName, '\n') != NULL) {
492
+
493
+ achAnotherName[strlen(achAnotherName) - 1] = '\0';
494
+
495
+ }else{
496
+
497
+ while (getchar() != '\n');
498
+
499
+ }
500
+
501
+ len = strlen(achAnotherName);
502
+
503
+
504
+
505
+ if (len == 0) {
506
+
507
+ printf("<<入力した文字が不正です>>\n");
508
+
509
+ getchar();
510
+
511
+ continue;
512
+
513
+ }
514
+
515
+ if (len > MAX_ANOTHER_NAME_LEN) {
516
+
517
+ printf("<<入力した文字の長さが大きすぎます>>\n");
518
+
519
+ getchar();
520
+
521
+ continue;
522
+
523
+ }
524
+
525
+ break;
526
+
527
+ }
528
+
529
+
530
+
531
+ while (1) {
532
+
533
+ system("cls");
534
+
535
+ printf("***** 顧客登録画面 *****\n");
536
+
537
+ printf("氏名 :%s\n", achName);
538
+
539
+ printf("ふりがな:%s\n", achAnotherName);
540
+
541
+ printf("電話番号:");
542
+
543
+
544
+
545
+ fgets(achTel, sizeof(achTel), stdin);
546
+
547
+ if (strchr(achTel, '\n') != NULL) {
548
+
549
+ achTel[strlen(achTel) - 1] = '\0';
550
+
551
+ }else{
552
+
553
+ while (getchar() != '\n');
554
+
555
+ }
556
+
557
+ len = strlen(achTel);
558
+
559
+
560
+
561
+ if (len > MAX_TEL_LEN) {
562
+
563
+ printf("<<入力した文字の長さが大きすぎます>>\n");
564
+
565
+ getchar();
566
+
567
+ continue;
568
+
569
+ }
570
+
571
+
572
+
573
+ for (i = 0; i < len; i++) {
574
+
575
+ if (achTel[i] == '-' || achTel[i] == '(' || achTel[i] == ')' || achTel[i] == '0'
576
+
577
+ || achTel[i] == '1' || achTel[i] == '2' || achTel[i] == '3'
578
+
579
+ || achTel[i] == '4' || achTel[i] == '5' || achTel[i] == '6'
580
+
581
+ || achTel[i] == '7' || achTel[i] == '8' || achTel[i] == '9') {
582
+
583
+ continue;
584
+
585
+ }
586
+
587
+ break;
588
+
589
+ }
590
+
591
+ /* 不正文字混入時はループを抜けるので */
592
+
593
+ /* lenとiの差異で分岐させる */
594
+
595
+ if (len == 0 || i != len) {
596
+
597
+ printf("<<入力した文字が不正です>>\n");
598
+
599
+ getchar();
600
+
601
+ continue;
602
+
603
+ }
604
+
605
+ /*------------------------------*/
606
+
607
+ acList[nCountup].lId = nCountup + 1; /* 顧客番号を構造体に登録する */
608
+
609
+ /*------------------------------*/
610
+
611
+ for (i = 0; achName[i] != '\0'; i++) { /*------------------------------*/
612
+
613
+ acList[nCountup].szName[i] = achName[i]; /* 氏名を構造体に登録する */
614
+
615
+ } /*------------------------------*/
616
+
617
+ acList[nCountup].szName[i] = '\0';
618
+
619
+
620
+
621
+ for (i = 0; achAnotherName[i] != '\0'; i++) { /*------------------------------*/
622
+
623
+ acList[nCountup].szAnotherName[i] = achAnotherName[i]; /* ふりがなを構造体に登録する */
624
+
625
+ } /*------------------------------*/
626
+
627
+ acList[nCountup].szAnotherName[i] = '\0';
628
+
629
+
630
+
631
+ for (i = 0; achTel[i] != '\0'; i++) { /*------------------------------*/
632
+
633
+ acList[nCountup].szTel[i] = achTel[i]; /* 電話番号を構造体に登録する */
634
+
635
+ } /*------------------------------*/
636
+
637
+ acList[nCountup].szTel[i] = '\0';
638
+
639
+
640
+
641
+ // printf("\n%s%s%s\n", acList[nCountup].szName, acList[nCountup].szAnotherName, acList[nCountup].szTel); ////////////////デバッグ
642
+
643
+ // printf("\n%ld%s%s%s\n", acList[0].lId, acList[0].szName, acList[0].szAnotherName, acList[0].szTel); ////////////////デバッグ
644
+
645
+ // printf("\n%ld%s%s%s\n", acList[1].lId, acList[1].szName, acList[1].szAnotherName, acList[1].szTel); ////////////////デバッグ
646
+
647
+ // printf("\n%ld%s%s%s\n", acList[2].lId, acList[2].szName, acList[2].szAnotherName, acList[2].szTel); ////////////////デバッグ
648
+
649
+ printf("\n登録しました。\n");
650
+
651
+ getchar();
652
+
653
+ return;
654
+
655
+ }
656
+
657
+ }