回答編集履歴

4

誤記訂正

2020/11/15 23:38

投稿

DreamTheater
DreamTheater

スコア1095

test CHANGED
@@ -30,8 +30,6 @@
30
30
 
31
31
  余裕のあるバッファを確保して、かつscanfの結果を保護するのであれば、
32
32
 
33
-
34
-
35
33
  上記なら80バイトまでの文字列はNULL終端されますし、
36
34
 
37
35
  入力が80バイトを超えた場合、80バイトで打ち切ってnull終端した文字列を返却してくれます。
@@ -39,8 +37,6 @@
39
37
  これならバッファーオーバーフローを心配しなくて済みます。
40
38
 
41
39
  ※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。~~
42
-
43
-
44
40
 
45
41
  ~~### ■追記2
46
42
 

3

誤記訂正

2020/11/15 23:38

投稿

DreamTheater
DreamTheater

スコア1095

test CHANGED
@@ -26,19 +26,11 @@
26
26
 
27
27
 
28
28
 
29
- ### ■追記
29
+ ~~### ■追記
30
30
 
31
31
  余裕のあるバッファを確保して、かつscanfの結果を保護するのであれば、
32
32
 
33
- ```C
34
33
 
35
- char hogehoge[80 + 1];
36
-
37
-
38
-
39
- (void)scanf("%.80s", hogehoge);
40
-
41
- ```
42
34
 
43
35
  上記なら80バイトまでの文字列はNULL終端されますし、
44
36
 
@@ -46,52 +38,20 @@
46
38
 
47
39
  これならバッファーオーバーフローを心配しなくて済みます。
48
40
 
49
- ※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。
41
+ ※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。~~
50
42
 
51
43
 
52
44
 
53
- ### ■追記2
45
+ ~~### ■追記2
54
46
 
55
47
  文字列を入力させる前に、何文字入力するか問い合わせてその文字数+1の領域を動的に確保する。
56
48
 
57
49
  という方法を思いつきましたが、もうすこしマシな方法がありました。
58
50
 
59
- ```C
60
-
61
- long pos = 0;
62
-
63
- size_t buffSize = 2;
51
+ Cのコンパイル環境がないのでエラーが出たらごめんなさい。~~
64
-
65
- char *wordBuff;
66
52
 
67
53
 
68
54
 
69
- wordBuff = malloc(buffSize++); /* 動的メモリ2バイト確保 */
55
+ ### ■追記3
70
56
 
71
- for(;;) {
72
-
73
- (void)scanf("%c", wordBuff + pos); /* 1文字取得 */
74
-
75
- if (*(wordBuff + pos) = '\0') break; /* NULL終端らループ抜け */
57
+ 辞書に載っている最大長の英単語が45文字(pneumonoulttamicroscopicsilicovolcanoconiosis)ので、46バイト以上の配列確保すれば、一応命題はクリアできと思います。
76
-
77
- buffSize++; /* バッファサイズに1加算 */
78
-
79
- wordBuff = realloc(wordBuff, buffSize); /* バッファ再確保 */
80
-
81
- if wordBuff == NULL { /* メモリ不足なら強制終了 */
82
-
83
- printf("can not enough memory!\n");
84
-
85
- exit(2);
86
-
87
- }
88
-
89
- pos++; /* 取得位置を更新 */
90
-
91
- }
92
-
93
-
94
-
95
- ```
96
-
97
- Cのコンパイル環境がないのでエラーが出たらごめんなさい。

2

追記

2020/11/15 23:36

投稿

DreamTheater
DreamTheater

スコア1095

test CHANGED
@@ -47,3 +47,51 @@
47
47
  これならバッファーオーバーフローを心配しなくて済みます。
48
48
 
49
49
  ※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。
50
+
51
+
52
+
53
+ ### ■追記2
54
+
55
+ 文字列を入力させる前に、何文字入力するか問い合わせてその文字数+1の領域を動的に確保する。
56
+
57
+ という方法を思いつきましたが、もうすこしマシな方法がありました。
58
+
59
+ ```C
60
+
61
+ long pos = 0;
62
+
63
+ size_t buffSize = 2;
64
+
65
+ char *wordBuff;
66
+
67
+
68
+
69
+ wordBuff = malloc(buffSize++); /* 動的メモリ2バイト確保 */
70
+
71
+ for(;;) {
72
+
73
+ (void)scanf("%c", wordBuff + pos); /* 1文字取得 */
74
+
75
+ if (*(wordBuff + pos) = '\0') break; /* NULL終端ならループを抜ける */
76
+
77
+ buffSize++; /* バッファサイズに1加算 */
78
+
79
+ wordBuff = realloc(wordBuff, buffSize); /* バッファ再確保 */
80
+
81
+ if wordBuff == NULL { /* メモリ不足なら強制終了 */
82
+
83
+ printf("can not enough memory!\n");
84
+
85
+ exit(2);
86
+
87
+ }
88
+
89
+ pos++; /* 取得位置を更新 */
90
+
91
+ }
92
+
93
+
94
+
95
+ ```
96
+
97
+ Cのコンパイル環境がないのでエラーが出たらごめんなさい。

1

追記

2020/11/13 06:24

投稿

DreamTheater
DreamTheater

スコア1095

test CHANGED
@@ -23,3 +23,27 @@
23
23
  あまり良くないではなく絶対ダメなコードです。
24
24
 
25
25
  配列やポインタをもっと学習することを強くお勧めします。
26
+
27
+
28
+
29
+ ### ■追記
30
+
31
+ 余裕のあるバッファを確保して、かつscanfの結果を保護するのであれば、
32
+
33
+ ```C
34
+
35
+ char hogehoge[80 + 1];
36
+
37
+
38
+
39
+ (void)scanf("%.80s", hogehoge);
40
+
41
+ ```
42
+
43
+ 上記なら80バイトまでの文字列はNULL終端されますし、
44
+
45
+ 入力が80バイトを超えた場合、80バイトで打ち切ってnull終端した文字列を返却してくれます。
46
+
47
+ これならバッファーオーバーフローを心配しなくて済みます。
48
+
49
+ ※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。