回答編集履歴

3

コメントの修正

2021/08/10 02:51

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -158,7 +158,7 @@
158
158
 
159
159
  printf("|%s|\n", p); // str中の p から q までを表示
160
160
 
161
- if (ch == 0) // str の最後まで達したので
161
+ if (ch == 0) // str の最後まで達したならば
162
162
 
163
163
  break; // for(;;) のループを終了
164
164
 

2

追記2

2021/08/10 02:51

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -101,3 +101,73 @@
101
101
  ch = *q;
102
102
 
103
103
  ```
104
+
105
+ **追記2**
106
+
107
+ 何をするコードかを分かっていないのではありませんか?
108
+
109
+
110
+
111
+ 文字列を区切り文字('?' と ':')で分割して、
112
+
113
+ 分割された各文字列を表示するプログラムです。
114
+
115
+
116
+
117
+ すべての行にコメントを付けてみました。
118
+
119
+ ```C
120
+
121
+ #include <stdio.h>
122
+
123
+
124
+
125
+ int main(void)
126
+
127
+ {
128
+
129
+ char str[] = "str == NULL ? \"(NULL)\": str"; // 配列strを文字列で初期化
130
+
131
+ char *p, *q; // p と q は、分割した文字列の先頭と末尾を指すためのもの
132
+
133
+ int ch; // ch は、発見した区切り文字を入れるためのもの
134
+
135
+ p = str; // p はポインタで、str[0] のアドレスを持つ。str[0] を指す
136
+
137
+ for (;;) { // 無限ループ。途中の break でループを終了
138
+
139
+ // 次の for文は、str中の区切り文字の位置を探すためのもの
140
+
141
+ for (q = p; // q はポインタで、最初は str[0] を指し、
142
+
143
+ // for(;;)ループの 2回目からは分割した残りの文字列の先頭を指す
144
+
145
+ !(*q == '?' || *q == ':' || *q == 0);
146
+
147
+ // q の指す文字が区切り文字や strの終端でなければ、ループを続行
148
+
149
+ q++) // q は、str中の次の文字を指す(ループの本体の ; の次に実行)
150
+
151
+ ; // ループの本体の文だが何もしない
152
+
153
+
154
+
155
+ ch = *q; // ch は、上のforループ終了後 q が指している区切り文字
156
+
157
+ *q = 0; // q が指している str の文字を '\0' に変える。分割できた!
158
+
159
+ printf("|%s|\n", p); // str中の p から q までを表示
160
+
161
+ if (ch == 0) // str の最後まで達したので、
162
+
163
+ break; // for(;;) のループを終了
164
+
165
+ p = q + 1; // p は、今 分割した残りの文字列の先頭を指す
166
+
167
+ }
168
+
169
+ }
170
+
171
+ ```
172
+
173
+ 分からないのはどこですか?

1

追記

2021/08/10 02:40

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -69,3 +69,35 @@
69
69
 
70
70
 
71
71
  ループ終了後には `ch = *q:` は実行されません。
72
+
73
+
74
+
75
+ **追記**
76
+
77
+ Visual Studio のステップ実行は行単位なので、
78
+
79
+ ```C
80
+
81
+ for (q = p; !(*q == '?' || *q == ':' || *q == 0); q++);`
82
+
83
+ ch = *q;
84
+
85
+ ```
86
+
87
+ これだと for文の動きが分かりません。
88
+
89
+ そこで、次のように書き換えてからデバッグ実行してみてはいかがでしょうか?
90
+
91
+ ```C
92
+
93
+ for (q = p;
94
+
95
+ !(*q == '?' || *q == ':' || *q == 0);
96
+
97
+ q++)
98
+
99
+ ;
100
+
101
+ ch = *q;
102
+
103
+ ```