回答編集履歴
4
誤記訂正
answer
CHANGED
@@ -14,12 +14,10 @@
|
|
14
14
|
|
15
15
|
~~### ■追記
|
16
16
|
余裕のあるバッファを確保して、かつscanfの結果を保護するのであれば、
|
17
|
-
|
18
17
|
上記なら80バイトまでの文字列はNULL終端されますし、
|
19
18
|
入力が80バイトを超えた場合、80バイトで打ち切ってnull終端した文字列を返却してくれます。
|
20
19
|
これならバッファーオーバーフローを心配しなくて済みます。
|
21
20
|
※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。~~
|
22
|
-
|
23
21
|
~~### ■追記2
|
24
22
|
文字列を入力させる前に、何文字入力するか問い合わせてその文字数+1の領域を動的に確保する。
|
25
23
|
という方法を思いつきましたが、もうすこしマシな方法がありました。
|
3
誤記訂正
answer
CHANGED
@@ -12,38 +12,18 @@
|
|
12
12
|
あまり良くないではなく絶対ダメなコードです。
|
13
13
|
配列やポインタをもっと学習することを強くお勧めします。
|
14
14
|
|
15
|
-
### ■追記
|
15
|
+
~~### ■追記
|
16
16
|
余裕のあるバッファを確保して、かつscanfの結果を保護するのであれば、
|
17
|
-
```C
|
18
|
-
char hogehoge[80 + 1];
|
19
17
|
|
20
|
-
(void)scanf("%.80s", hogehoge);
|
21
|
-
```
|
22
18
|
上記なら80バイトまでの文字列はNULL終端されますし、
|
23
19
|
入力が80バイトを超えた場合、80バイトで打ち切ってnull終端した文字列を返却してくれます。
|
24
20
|
これならバッファーオーバーフローを心配しなくて済みます。
|
25
|
-
※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。
|
21
|
+
※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。~~
|
26
22
|
|
27
|
-
### ■追記2
|
23
|
+
~~### ■追記2
|
28
24
|
文字列を入力させる前に、何文字入力するか問い合わせてその文字数+1の領域を動的に確保する。
|
29
25
|
という方法を思いつきましたが、もうすこしマシな方法がありました。
|
30
|
-
```C
|
31
|
-
long pos = 0;
|
32
|
-
|
26
|
+
Cのコンパイル環境がないのでエラーが出たらごめんなさい。~~
|
33
|
-
char *wordBuff;
|
34
27
|
|
35
|
-
wordBuff = malloc(buffSize++); /* 動的メモリ2バイト確保 */
|
36
|
-
for(;;) {
|
37
|
-
(void)scanf("%c", wordBuff + pos); /* 1文字取得 */
|
38
|
-
if (*(wordBuff + pos) = '\0') break; /* NULL終端ならループを抜ける */
|
39
|
-
buffSize++; /* バッファサイズに1加算 */
|
40
|
-
wordBuff = realloc(wordBuff, buffSize); /* バッファ再確保 */
|
41
|
-
if wordBuff == NULL { /* メモリ不足なら強制終了 */
|
42
|
-
printf("can not enough memory!\n");
|
43
|
-
|
28
|
+
### ■追記3
|
44
|
-
}
|
45
|
-
|
29
|
+
辞書に載っている最大長の英単語が45文字(pneumonoulttamicroscopicsilicovolcanoconiosis)なので、46バイト以上の配列を確保すれば、一応命題はクリアできると思います。
|
46
|
-
}
|
47
|
-
|
48
|
-
```
|
49
|
-
Cのコンパイル環境がないのでエラーが出たらごめんなさい。
|
2
追記
answer
CHANGED
@@ -22,4 +22,28 @@
|
|
22
22
|
上記なら80バイトまでの文字列はNULL終端されますし、
|
23
23
|
入力が80バイトを超えた場合、80バイトで打ち切ってnull終端した文字列を返却してくれます。
|
24
24
|
これならバッファーオーバーフローを心配しなくて済みます。
|
25
|
-
※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。
|
25
|
+
※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。
|
26
|
+
|
27
|
+
### ■追記2
|
28
|
+
文字列を入力させる前に、何文字入力するか問い合わせてその文字数+1の領域を動的に確保する。
|
29
|
+
という方法を思いつきましたが、もうすこしマシな方法がありました。
|
30
|
+
```C
|
31
|
+
long pos = 0;
|
32
|
+
size_t buffSize = 2;
|
33
|
+
char *wordBuff;
|
34
|
+
|
35
|
+
wordBuff = malloc(buffSize++); /* 動的メモリ2バイト確保 */
|
36
|
+
for(;;) {
|
37
|
+
(void)scanf("%c", wordBuff + pos); /* 1文字取得 */
|
38
|
+
if (*(wordBuff + pos) = '\0') break; /* NULL終端ならループを抜ける */
|
39
|
+
buffSize++; /* バッファサイズに1加算 */
|
40
|
+
wordBuff = realloc(wordBuff, buffSize); /* バッファ再確保 */
|
41
|
+
if wordBuff == NULL { /* メモリ不足なら強制終了 */
|
42
|
+
printf("can not enough memory!\n");
|
43
|
+
exit(2);
|
44
|
+
}
|
45
|
+
pos++; /* 取得位置を更新 */
|
46
|
+
}
|
47
|
+
|
48
|
+
```
|
49
|
+
Cのコンパイル環境がないのでエラーが出たらごめんなさい。
|
1
追記
answer
CHANGED
@@ -10,4 +10,16 @@
|
|
10
10
|
> これが表示されるのはあまり良くない気がします・・・
|
11
11
|
|
12
12
|
あまり良くないではなく絶対ダメなコードです。
|
13
|
-
配列やポインタをもっと学習することを強くお勧めします。
|
13
|
+
配列やポインタをもっと学習することを強くお勧めします。
|
14
|
+
|
15
|
+
### ■追記
|
16
|
+
余裕のあるバッファを確保して、かつscanfの結果を保護するのであれば、
|
17
|
+
```C
|
18
|
+
char hogehoge[80 + 1];
|
19
|
+
|
20
|
+
(void)scanf("%.80s", hogehoge);
|
21
|
+
```
|
22
|
+
上記なら80バイトまでの文字列はNULL終端されますし、
|
23
|
+
入力が80バイトを超えた場合、80バイトで打ち切ってnull終端した文字列を返却してくれます。
|
24
|
+
これならバッファーオーバーフローを心配しなくて済みます。
|
25
|
+
※scanfのフォーマット指定子で文字列%sに小数を指定すると小数の値が最大文字列となります。
|