#include <stdio.h> #include <string.h> int main(void) { char str[] = "str == NULL ? \"(NULL)\" : str"; char* p, * q; int ch; p = str; for (;;) { for (q = p; !(*q == '?' || *q == ':' || *q == 0); q++); ch = *q; *q = 0; printf("|%s|\n", p); if (ch == 0) break; p = q + 1; } }
のコードについてデバッグをして中身を確認したかったため
以下のように置いて
```ここに言語を入力 #include <stdio.h> #include <string.h> int main(void) { char str[] = "str == NULL ? \"(NULL)\" : str"; char *p, *q; int ch; p = str; printf("before loop\n"); printf(" str = |%s|\n", str); printf(" p = |%s|\n", p); for (;;) { printf("loop start\n"); printf("--before inner loop\n"); printf(" str = |%s|\n", str); printf(" p = |%s|\n", p); for (q = p; !(*q == '?' || *q == ':' || *q == 0); q++) ; printf("--after inner loop\n"); printf(" str = |%s|\n", str); printf(" p = |%s|\n", p); printf(" q = |%s|\n", q); ch = *q; *q = 0; printf("--after *q = 0\n"); printf(" str = |%s|\n", str); printf(" p = |%s|\n", p); printf(" q = |%s|\n", q); printf("|%s|\n", p); if (ch == 0) break; p = q + 1; printf("--after p = q + 1\n"); printf(" str = |%s|\n", str); printf(" p = |%s|\n", p); printf(" q = |%s|\n", q); printf("loop end\n\n"); } printf("after loop\n"); printf(" str = |%s|\n", str); printf(" p = |%s|\n", p); printf(" q = |%s|\n", q); }
以下のように出力が出ました。
before loop str = |str == NULL ? "(NULL)" : str| p = |str == NULL ? "(NULL)" : str| loop start --before inner loop str = |str == NULL ? "(NULL)" : str| p = |str == NULL ? "(NULL)" : str| --after inner loop str = |str == NULL ? "(NULL)" : str| p = |str == NULL ? "(NULL)" : str| q = |? "(NULL)" : str| --after *q = 0 str = |str == NULL | p = |str == NULL | q = || |str == NULL | --after p = q + 1 str = |str == NULL | p = | "(NULL)" : str| q = || loop end loop start --before inner loop str = |str == NULL | p = | "(NULL)" : str| --after inner loop str = |str == NULL | p = | "(NULL)" : str| q = |: str| --after *q = 0 str = |str == NULL | p = | "(NULL)" | q = || | "(NULL)" | --after p = q + 1 str = |str == NULL | p = | str| q = || loop end loop start --before inner loop str = |str == NULL | p = | str| --after inner loop str = |str == NULL | p = | str| q = || --after *q = 0 str = |str == NULL | p = | str| q = || | str| after loop str = |str == NULL | p = | str| q = ||
- ただなぜ途中から str の中身が |str == NULL |のみになったのかわかりません。
自分なりに考えたのですが
ポインタqがq=0よりforの条件に入る部分の先頭の文字からNULLまでを要は、 |str == NULL ? "(NULL)" : str|の? "(NULL)" : strを消してしまったため、 そして、ポインタP= |str == NULL |が残っている。。。いや自信がないです。なぜstr の中身が |str == NULL |のみになったのでしょうか? またどうやって "(NULL)" : str|は残っていたのでしょうか?
https://oshiete.goo.ne.jp/qa/12210060.html
マークダウンの記号があるからどこかのコピペなんだろうと思ってたけどこのアカウントの存在は知らなかったぜ…
複垢マルチポストを駆使して何故理解できないのかも分からないし、何故ここまでして理解したいのかも分からん。
この質問には答える気になれませんなぁ...
>複垢マルチポストを駆使して何故理解できないのか
駆使するから理解できないと言えます。こんなに散らかってしまった情報を整理できるわけがないんだから。(熟練者でも無理。というか熟練者はそんなことやらない。考えてから動くから)
teratailの利用規約にある第7条(禁止事項)の(11)複数のユーザーIDを1人で保有する行為
に明確に違反していると認識しましたので、利用規約違反として通知しました。
どうでもいいけど、teratailの通知方法が非常に分かりづらい。