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

回答編集履歴

4

誤記訂正

2020/11/15 23:38

投稿

DreamTheater
DreamTheater

スコア1095

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

誤記訂正

2020/11/15 23:38

投稿

DreamTheater
DreamTheater

スコア1095

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
- size_t buffSize = 2;
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
- exit(2);
28
+ ### ■追記3
44
- }
45
- pos++; /* 取得位置更新 */
29
+ 辞書に載っている最大長の英単語が45文字(pneumonoulttamicroscopicsilicovolcanoconiosis)なので、46バイト以上の配列確保すれば、一応命題はクリアできると思います。
46
- }
47
-
48
- ```
49
- Cのコンパイル環境がないのでエラーが出たらごめんなさい。

2

追記

2020/11/15 23:36

投稿

DreamTheater
DreamTheater

スコア1095

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

追記

2020/11/13 06:24

投稿

DreamTheater
DreamTheater

スコア1095

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に小数を指定すると小数の値が最大文字列となります。