![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
#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 = ||
```
0. ただなぜ途中から str の中身が |str == NULL |のみになったのかわかりません。
自分なりに考えたのですが
ポインタqがq=0よりforの条件に入る部分の先頭の文字からNULLまでを要は、 |str == NULL ? "(NULL)" : str|の? "(NULL)" : strを消してしまったため、 そして、ポインタP= |str == NULL |が残っている。。。いや自信がないです。なぜstr の中身が |str == NULL |のみになったのでしょうか? またどうやって "(NULL)" : str|は残っていたのでしょうか?
No.4ベストアンサー
- 回答日時:
> ただなぜ途中から str の中身が |str == NULL |のみになったのかわかりません。
下図の状態のとき、
"str == NULL ? \"(NULL)\" : str"
↑
q
つまり、「*qが'?'を指している」ときに、
*q = 0;
を実行して’?’を0に書き換えた結果、
文字列 "str == NULL ? \"(NULL)\" : str" が
文字列 "str == NULL" に書き換えられたため
です
No.5
- 回答日時:
> #4
言わんとしてる事は分かるんだけど、この質問投稿者は
> 文字列 "str == NULL ? \"(NULL)\" : str" が
> 文字列 "str == NULL" に書き換えられたためです
って言うから勘違いするんですよ。
1. C言語には文字列なんつー高級なデータ型がそもそもない
2. C言語には文字列なんつー高級なデータ型を代入出来るような変数は存在しない
のが徹底的に分かってない。
分かってないからこその連投なんです。
要するに #2 で挙げたような、
"Hello, world!\0"
と言う配列が
"Hello\0 world!\0"
と書き換えられた時の、書式文字列"%s"の動作が分かってない、だけなんです。
ポインタもクソも関係ない。
ポインタ関係ないのにポインタ弄ってドツボにハマってるだけ、なんですよ。
問題は「配列の書き換えとそれに伴う出力関数の動作」なんです。
そこを全然関係ないポインタにこだわって理解を自ら妨げてるだけ、なんです。
#3氏が指摘してるのもそこなのです。
No.3
- 回答日時:
printf(" str = |%s|\n", str);
これがどのように動くか、説明できますか。
別の質問での回答で説明していますのでそちらをよく読みこんで考えてください。
No.2
- 回答日時:
> 是非詳しく原因を教えてください
原因も何も・・・。
そもそも実は全然ポインタ関係ないですよ?
次のコードを打って確認してみてください。
#include <stdio.h>
int main(void) {
char str[] = "Hello, world!";
str[5] = 0;
puts(str);
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Visual Basic(VBA) ブックのCOPY 4 2023/02/25 20:17
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
分数を表示するプログラム(長...
-
改行について 1行に何個かづ...
-
C言語で、「自然数nを入力し、n...
-
既約分数の表示プログラム
-
10個出力で改行したいのですが...
-
【C言語教えてください】sin波...
-
ホームページをC言語で作りたい...
-
コンパイルエラーについて
-
printf( " %2d", p * q );
-
CTRL+Dでループを抜けるには
-
C言語について
-
wsprintfの書式制御文字列につ...
-
hit&bolwのプログラミングがで...
-
C言語の文字列一部取得について
-
なぜgccはstdio.hをインクルー...
-
ifなんですが
-
#include <stdio.h> #include <...
-
台形の面積を求めるプログラム
-
プログラミング合っているか教...
-
C言語でマウス入力(クリックや...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
strcmp
-
コンパイルエラーについて
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
cshの文字列操作(0埋め)
-
4の倍数を論理演算で表す。。
-
C言語 プログラミング
-
%P と %X の違い
-
8人分のテストの点数を入力し、...
-
C言語での、年複利の計算方法...
-
printf( " %2d", p * q );
-
hit&bolwのプログラミングがで...
-
scanfに文字が入力されたときに...
-
error C2143: 構文エラー : ';'...
-
printfの出力内の文字をdefine...
-
テキストカーソル位置の取得
-
unsigned int型について
おすすめ情報