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

回答編集履歴

2

コードの修正

2019/07/06 01:25

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -13,7 +13,7 @@
13
13
  i += n;
14
14
  if (sscanf(text + i, "%255[a-zA-Z]%n", str, &n) != 1) break;
15
15
  i += n;
16
- puts(str);
16
+ printf("[%s]\n", str);
17
17
  }
18
18
  }
19
19
  ```
@@ -26,14 +26,19 @@
26
26
 
27
27
  int main(void)
28
28
  {
29
- char text[] = "It is good to see you. Thank you for coming.";
29
+ char text[] = "It is good to see you. Thank you for coming";
30
+ unsigned char c;
30
- unsigned char c, n = 0; // n: newline flag
31
+ int n = 0, i = 0, j = 0;
31
- for (int i = 0; c = text[i]; i++)
32
+ for (; c = text[i]; i++)
32
- if (isalpha(c)) n = putchar(c);
33
+ if (isalpha(c)) !n && (n = 1, j = i);
33
- else if (n) n = !putchar('\n');
34
+ else if (n) n = !printf("[%.*s]\n", i - j, text + j);
34
- if (n) putchar('\n');
35
+ if (n) printf("[%.*s]\n", i - j, text + j);
35
36
  }
36
37
  ```
37
38
  isalpha(c) の c は EOF 以外の負の値であってはならないので
38
39
  unsigned char c; にしています。
39
- n は、単語を表示しているので後で改行が必要ですというフラグです。
40
+ n は、単語を表示しているので後で改行が必要ですというフラグです。
41
+ ### 追記
42
+ > 出力する単語は一行に一単語ずつ '['と']' で囲んで出力する
43
+
44
+ この条件を満たしていなかったのでコードを修正しました。

1

別解の追加

2019/07/06 01:25

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -16,4 +16,24 @@
16
16
  puts(str);
17
17
  }
18
18
  }
19
- ```
19
+ ```
20
+ ### 別解
21
+ やっぱり、sscanf は文字列を分割する関数になるかもしれないので、
22
+ 別のやり方にします。
23
+ ```C
24
+ #include <stdio.h>
25
+ #include <ctype.h>
26
+
27
+ int main(void)
28
+ {
29
+ char text[] = "It is good to see you. Thank you for coming.";
30
+ unsigned char c, n = 0; // n: newline flag
31
+ for (int i = 0; c = text[i]; i++)
32
+ if (isalpha(c)) n = putchar(c);
33
+ else if (n) n = !putchar('\n');
34
+ if (n) putchar('\n');
35
+ }
36
+ ```
37
+ isalpha(c) の c は EOF 以外の負の値であってはならないので
38
+ unsigned char c; にしています。
39
+ n は、単語を表示しているので後で改行が必要ですというフラグです。