質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

1738閲覧

文字列の処理の過程の展開を詳しく調べたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/02/16 08:10

#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 = ||
  1. ただなぜ途中から str の中身が |str == NULL |のみになったのかわかりません。

自分なりに考えたのですが
ポインタqがq=0よりforの条件に入る部分の先頭の文字からNULLまでを要は、 |str == NULL ? "(NULL)" : str|の? "(NULL)" : strを消してしまったため、 そして、ポインタP= |str == NULL |が残っている。。。いや自信がないです。なぜstr の中身が |str == NULL |のみになったのでしょうか? またどうやって "(NULL)" : str|は残っていたのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Munosuke222

2021/02/16 09:26 編集

https://oshiete.goo.ne.jp/qa/12210060.html マークダウンの記号があるからどこかのコピペなんだろうと思ってたけどこのアカウントの存在は知らなかったぜ… 複垢マルチポストを駆使して何故理解できないのかも分からないし、何故ここまでして理解したいのかも分からん。
episteme

2021/02/16 10:01

この質問には答える気になれませんなぁ...
m.ts10806

2021/02/16 10:03

>複垢マルチポストを駆使して何故理解できないのか 駆使するから理解できないと言えます。こんなに散らかってしまった情報を整理できるわけがないんだから。(熟練者でも無理。というか熟練者はそんなことやらない。考えてから動くから)
kaina

2021/02/17 05:46

teratailの利用規約にある第7条(禁止事項)の(11)複数のユーザーIDを1人で保有する行為 に明確に違反していると認識しましたので、利用規約違反として通知しました。 どうでもいいけど、teratailの通知方法が非常に分かりづらい。
guest

回答1

0

まず、Cでは文字列の最後は'0'(数値です)で終了することになっています。
このプログラムでは、'?'、':'が見つかったとき、'?'、':'を'0'で置き換えます。
'?'が'0'に置き換えれたため、strを先頭から表示すると"str == NULL "になってしまいます。

strで書き換えられのは以下の'0'になっている、2か所になります。
それ以外の文字列は消えていません。

text

1"str == NULL ? \"(NULL)\" : str" 2"------------0------------0----"

投稿2021/02/16 08:55

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2021/02/16 09:18

'0' と書かずに、'\0' または 0 と書いてほしい。
退会済みユーザー

退会済みユーザー

2021/02/16 09:39

kazuma-sさんは疑問の原因はわかりますか? もし情報が足りなければさらにデバッグして情報を探します。
episteme

2021/02/17 05:18

回答そっちのけでkazuma-sさんに問うのはあまりに無礼。
fana

2021/02/17 05:53

この回答自体が「原因」に関して述べている物と見えますから, まずは回答されている内容通りの事柄が起こっているのかどうかを確認してみてはどうでしょう. 参考情報: 偶然にも,別の人物が直近で同内容の質問をしており,そこでこの回答と同様の回答がなされています. https://teratail.com/questions/322763#reply-447877
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問