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

回答編集履歴

1

追記

2021/08/07 07:27

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -21,4 +21,48 @@
21
21
  ch = *q; 実行後の ch の値がどう変わるかを見ましょう。
22
22
  ch = *q; は3回通るので、その全部の値を見てください。
23
23
 
24
- コメントをお願いします。
24
+ コメントをお願いします。
25
+
26
+ **追記**
27
+
28
+ > 疑問があります。なぜforループの二周目以降のデバッグでのstr[]の中身はstr == NULLであるのに、一週目のみstr[]の中身はstr == NULL ? \"(NULL)\": strであるかについてです。
29
+
30
+ 質問の最初の部分について回答します。
31
+ Visual Studio で変数の値を見ていますよね。
32
+
33
+ 変数strの値として、その変数のアドレスと、
34
+ そこから'\0'までの文字列が表示されています。
35
+
36
+ str の前の「右向き△」をクリックして「下向き▽」にしてください。
37
+ str[0]~str[27] がすべて表示されます。
38
+
39
+ 表示ウィンドウが画面の下にあって全部見えないなら、
40
+ その表示ウィンドウをドラッグして右側に移動して縦に長くしてください。
41
+
42
+ str[0] が 115 's'
43
+ str[12] が 63 '?'
44
+ str[22] が 58 ':'
45
+ str[27] が 0 '\0'
46
+
47
+ 外側の for(;;) のループの 1周目で `*q = 0;` を実行する前は
48
+ str[27] が '\0' なので、str は文字列全体が表示されます。
49
+ `*q = 0;` を実行すると、str[12] が 0 '\0' になり、
50
+ 変数 str の文字列表示は "str == NULL" だけになります。
51
+ str[0] から str[12] までの文字列を表示しているからです。
52
+
53
+ 2周目で `*q = 0:` を実行すると、str[22] が 0 '\0' になりますが、
54
+ 変数 str の文字列表示は "str == NULL" のままです。
55
+ str[0] から str[12] までの文字列を表示しているからです。
56
+
57
+ 3周目で `*q = 0:` を実行すると、元から 0 の str[27] が 0 のままで、
58
+ 変数 str の文字列表示は "str == NULL" のままです。
59
+ str[0] から str[12] までの文字列を表示しているからです。
60
+
61
+ なお、printf("|%s|\n", p); で表示しているのは、
62
+ str の中の p から q までの部分文字列です。
63
+ 1周目は str[0]~str[12] の "str == NULL"
64
+ 2周目は str[13]~str[22] の " \"(NULL)\""
65
+ 3周目は str[23]~str[27] の " str"
66
+
67
+ 以上のことを Visual Studio で試してみて確認し、
68
+ 説明が理解できたかどうかをコメントしてください。