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

回答編集履歴

3

コメントの修正

2021/08/10 02:51

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -78,7 +78,7 @@
78
78
  ch = *q; // ch は、上のforループ終了後 q が指している区切り文字
79
79
  *q = 0; // q が指している str の文字を '\0' に変える。分割できた!
80
80
  printf("|%s|\n", p); // str中の p から q までを表示
81
- if (ch == 0) // str の最後まで達したので
81
+ if (ch == 0) // str の最後まで達したならば
82
82
  break; // for(;;) のループを終了
83
83
  p = q + 1; // p は、今 分割した残りの文字列の先頭を指す
84
84
  }

2

追記2

2021/08/10 02:51

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -49,4 +49,39 @@
49
49
  q++)
50
50
  ;
51
51
  ch = *q;
52
- ```
52
+ ```
53
+ **追記2**
54
+ 何をするコードかを分かっていないのではありませんか?
55
+
56
+ 文字列を区切り文字('?' と ':')で分割して、
57
+ 分割された各文字列を表示するプログラムです。
58
+
59
+ すべての行にコメントを付けてみました。
60
+ ```C
61
+ #include <stdio.h>
62
+
63
+ int main(void)
64
+ {
65
+ char str[] = "str == NULL ? \"(NULL)\": str"; // 配列strを文字列で初期化
66
+ char *p, *q; // p と q は、分割した文字列の先頭と末尾を指すためのもの
67
+ int ch; // ch は、発見した区切り文字を入れるためのもの
68
+ p = str; // p はポインタで、str[0] のアドレスを持つ。str[0] を指す
69
+ for (;;) { // 無限ループ。途中の break でループを終了
70
+ // 次の for文は、str中の区切り文字の位置を探すためのもの
71
+ for (q = p; // q はポインタで、最初は str[0] を指し、
72
+ // for(;;)ループの 2回目からは分割した残りの文字列の先頭を指す
73
+ !(*q == '?' || *q == ':' || *q == 0);
74
+ // q の指す文字が区切り文字や strの終端でなければ、ループを続行
75
+ q++) // q は、str中の次の文字を指す(ループの本体の ; の次に実行)
76
+ ; // ループの本体の文だが何もしない
77
+
78
+ ch = *q; // ch は、上のforループ終了後 q が指している区切り文字
79
+ *q = 0; // q が指している str の文字を '\0' に変える。分割できた!
80
+ printf("|%s|\n", p); // str中の p から q までを表示
81
+ if (ch == 0) // str の最後まで達したので、
82
+ break; // for(;;) のループを終了
83
+ p = q + 1; // p は、今 分割した残りの文字列の先頭を指す
84
+ }
85
+ }
86
+ ```
87
+ 分からないのはどこですか?

1

追記

2021/08/10 02:40

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -33,4 +33,20 @@
33
33
  D の実行終了後、C の q++ が実行されます。
34
34
  次にループ判定の B が実行されます。
35
35
 
36
- ループ終了後には `ch = *q:` は実行されません。
36
+ ループ終了後には `ch = *q:` は実行されません。
37
+
38
+ **追記**
39
+ Visual Studio のステップ実行は行単位なので、
40
+ ```C
41
+ for (q = p; !(*q == '?' || *q == ':' || *q == 0); q++);`
42
+ ch = *q;
43
+ ```
44
+ これだと for文の動きが分かりません。
45
+ そこで、次のように書き換えてからデバッグ実行してみてはいかがでしょうか?
46
+ ```C
47
+ for (q = p;
48
+ !(*q == '?' || *q == ':' || *q == 0);
49
+ q++)
50
+ ;
51
+ ch = *q;
52
+ ```