回答編集履歴
3
コメントの修正
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
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
追記
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
|
+
```
|