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

回答編集履歴

2

ソース修正

2018/07/20 00:37

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -34,7 +34,7 @@
34
34
  if( len > 5 ){
35
35
  puts("領域を超えています。");
36
36
  free(mojiretu);
37
- break;
37
+ continue; // break→continue
38
38
  }
39
39
  buf[len-1]= '\0'; // 改行を削除
40
40
  strcpy(mojiretu,buf);
@@ -46,12 +46,17 @@
46
46
  }
47
47
 
48
48
  usr~/test/c % ./a.out
49
+ 文字列を入力:1234567
50
+ 領域を超えています。
51
+ 文字列を入力:abc
52
+ 入力された文字列はabcです。
49
53
  文字列を入力:1234
50
54
  入力された文字列は1234です。
51
- 文字列を入力:abcd
52
- 入力された文字列はabcdです。
53
55
  文字列を入力:12345
54
56
  領域を超えています。
57
+ 文字列を入力:0
58
+ 入力された文字列は0です。
59
+ 文字列を入力:^C
55
60
  usr~/test/c %
56
-
57
- ```
61
+ ```
62
+ 一部修正しました、ただ、これだとメモリ確保に失敗しないと終了しません、

1

追記

2018/07/20 00:37

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -3,4 +3,55 @@
3
3
  繰り返し入力させるなら、確保→入力→解放の繰り返し while()の条件見直し。
4
4
  システム(OS)の空きメモリ開放は時間がかかるのでfree()推奨d^^。
5
5
  あと・・・メモリが確保できなというのは考えづらい。
6
- ちなみにうちの機械(linux:mem16GB)では、8GBぐらいなら余裕で確保できます。
6
+ ちなみにうちの機械(linux:mem16GB)では、8GBぐらいなら余裕で確保できます。
7
+
8
+ 「追記」
9
+ 繰り返し入力&メモリ確保失敗と入力長異常に対応(題意にそぐわないなら無視希望)
10
+ ```c
11
+ usr~/test/c % cat ct.c
12
+ #include<stdio.h>
13
+ #include<stdlib.h>
14
+ #include<string.h>
15
+
16
+ #define Forever for(;;)
17
+
18
+ int main(void)
19
+ {
20
+ char *mojiretu;
21
+ char buf[100];
22
+
23
+ Forever{
24
+ mojiretu = (char *)malloc(5);
25
+ if (mojiretu == NULL)
26
+ {
27
+ puts("メモリ確保失敗。");
28
+ break;
29
+ }
30
+
31
+ printf("文字列を入力:");
32
+ fgets(buf,sizeof buf - 1, stdin);
33
+ size_t len= strlen(buf);
34
+ if( len > 5 ){
35
+ puts("領域を超えています。");
36
+ free(mojiretu);
37
+ break;
38
+ }
39
+ buf[len-1]= '\0'; // 改行を削除
40
+ strcpy(mojiretu,buf);
41
+ printf("入力された文字列は%sです。\n", mojiretu);
42
+ free(mojiretu);
43
+ }
44
+
45
+ return 0;
46
+ }
47
+
48
+ usr~/test/c % ./a.out
49
+ 文字列を入力:1234
50
+ 入力された文字列は1234です。
51
+ 文字列を入力:abcd
52
+ 入力された文字列はabcdです。
53
+ 文字列を入力:12345
54
+ 領域を超えています。
55
+ usr~/test/c %
56
+
57
+ ```