🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Q&A

4回答

3221閲覧

デバッグによるchar str[] の中身の変化の理由が知りたいです。

carnage0216

総合スコア194

C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

0グッド

0クリップ

投稿2021/02/15 19:48

編集2021/02/15 22:22
#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; } }

のプログラムをデバッグした際に char str[] = "str == NULL ? "(NULL)" : str";
の中身は "str == NULL ? "(NULL)" : str"
一回目のループで中身はstr == NULL ? "(NULL)" : str、二回目のループでstr == NULL
三回目のループでstr == NULLとなんだか想像したのと違った結果になります。
なぜでしょうか?
そして、
こちらのプログラムでは

#include <stdio.h> int main(void) { char str[] = "abcde" ; for (char* p = str; *p; ++p) { ++(*p); printf("%s\n", &(*p)); } }

str[]の中身はforループによって以下のように変化します。
char p = str[]より、str[]の中身はpに代入しているためstr[]に影響はないと思ったのですが。*
最初はchar str[] = { "abcde" };の中身はabcdeでしたが、一回目のループでbbcde、二回目でbccde、三回目bcdde
四回目bcdee

bbcde ccde dde ee f

デバッグ画像

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

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

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

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

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

m.ts10806

2021/02/15 21:46

>想像したのと違った結果 思った通りじゃなく書いた通りに動いてるから。
m.ts10806

2021/02/15 21:46

「デバッグ」を質問タグに入れてる割にデバッグしてないわけですよね?
carnage0216

2021/02/15 21:58

忘れてた。教えてくれてサンクス。
m.ts10806

2021/02/15 22:15 編集

友達でもない人にタメ口聞ける神経は分かりかねます。 あなた何様?
m.ts10806

2021/02/15 22:05

あと「デバッグすること」「プログラムは書いたとおりに動く」 何度指摘されてますか?「忘れてた」で済まされるほど稀有な指摘ですか? プログラミングやる気は一切ないというのが分かります。過去のアドバイスは全てゴミだということですよね。
guest

回答4

0

コメント欄に写真が貼れなかったので
新たな回答として投稿させてもらいます

for文1周目は'?'を見つけてそれを\0に書き換えるので
以下のようになります

1周目

for文2周目は:を見つけてそれを\0に書き換えるので
以下のようになります

2周目

投稿2021/02/16 03:35

DaiGuard

総合スコア159

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

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

m.ts10806

2021/02/16 03:45

回答編集して追記すれば良いです。 1万字まで入ります。 これまでのコメント回答ひとつにおさまるのでは? (当の質問者を理解させようとするなら質問の回答という形式を取る限り無理です)
Zuishin

2021/02/16 03:54

視点を変えた回答なら複数する意味もわかるけど、一つの回答を分割して投稿する意味がわからない。投稿日時と編集日時を見て時系列を追えということだろうか。
fana

2021/02/16 09:12

残念なお知らせ https://teratail.com/questions/322870 「質問者のアカウントが異なっている=別人という体裁」となっていますから, (リンク先の質問に回答するならば)また最初から話を始めないとならないかもしれません.
Zuishin

2021/02/16 09:35

同じことを何度でも繰り返しますね、この人は。 他の人ならわざとやってるんじゃないかと思うところだけど、まあ彼は実際に何もできないんでしょうね。
episteme

2021/02/16 09:55

> (リンク先の質問に回答するならば)また最初から話を始めないとならないかもしれません. > 同じことを何度でも繰り返しますね、この人は。 ...知ってて相手してたけど、さすがに"お腹いっぱい”やね。
m.ts10806

2021/02/16 10:01

>...知ってて相手してたけど 相手する必要ないと思います。 むしろ通報で済ませてもいいくらい。
episteme

2021/02/16 10:08 編集

> むしろ通報で済ませてもいいくらい。 通報するからにはエビデンスを示さにゃならず、 マルチアカウント/マルチポスト先を列挙するだけでもメンドクセーwww # teratailだけでアカウントいくつ持ってたっけ? 片手じゃ足りんよな?
m.ts10806

2021/02/16 10:11

そこまでエビデンス出さなくても結構あげてくれてる人がいるので乗るだけでもいいかなと。 それより相手する人がいるから繰り返すのは明白なので、そっちのほうを。
episteme

2021/02/16 10:14

> 相手する人がいるから繰り返すのは明白なので それはそうですね。 ちょっと反省、しばし自重します。回答せずに修正依頼だけにするか。
m.ts10806

2021/02/16 10:19

個人的には低評価も勿体ないと思ってますが、あとはご自身の判断で。 (もっと向けるべき相手は沢山いるはずだから・・・)
episteme

2021/02/16 10:24

> もっと向けるべき相手は沢山いるはずだから・・・ せやな。 同類の質問を果てしなく繰り返すから「教え甲斐がない」てゆーか、砂を噛むよな寂寥感が。
knteil

2021/02/17 05:55

パッと出たので [teratail] carnage0216 John-Doe.7 DR.Dexter00 PaperZ R-ogiura Dapatoms KZK13 [yahoo知恵袋] daito_0216_1995 daito_1995com_0713 hokawamatu ultpa90887 [教えてgoo] venomctun captain06 質問しかしないんですよね。 せめて基礎を学んでくれたら。
K_3578

2021/06/09 02:11 編集

それだけマルチポストのために複垢作って質問投稿して回ってるならその間にいくらでも 基礎を学び直せそうですがね。
kaina

2021/02/17 06:14

こんなに作っていたのか。。。 少しでも改善できるようにと回答したのがほんと空しいですね。
Zuishin

2021/02/17 06:19

よくそれだけ調べましたね。あと自作自演に失敗してすぐ削除したものもありましたし、Stack Overflow や DX ライブラリ掲示板でもマルチポストを繰り返していたと思います。
knteil

2021/02/17 08:08

仰る通り、Stack OverflowやDXライブラリ掲示板にもありますね。 それぞれ正しく利用すれば素晴らしいサービスなのに、不毛なやりとりで情報が埋もれてしまい、以前から気になっておりました。。 相変わらずの状況でしたので、知ってる情報吐き出させていただきました。
carnage0216

2021/02/17 23:03

>>同類の質問を果てしなく繰り返すから「教え甲斐がない」てゆーか、砂を噛むよな寂寥感が。 教え方が下手なくせによく言いますねえい!
m.ts10806

2021/02/17 23:05

大体この手の人は他人のせいにする。テンプレ通りですね。 何年同じ場所から動いてないんですかあなた。 何回同じ説明させるんですかあなた。
episteme

2021/02/17 23:26

> 教え方が下手なくせによく言いますねえい! あなた以外からは 教え方が下手 と言われたことがないんよ。 教わり方が下手 なんじゃないですかあなた。
Zuishin

2021/02/17 23:49

kazuma-s さんの教え方がいちばん分かりやすいと常々言っていますが、あなたの質問のほとんどは kazuma-s さんのコードの意味を尋ねるものということに気づいていますか? 一番わかりやすいのではなく、動くコードをくれるから一番便利なんでしょう。 わからないところは質問乱立させないで本人に聞け。
Zuishin

2021/02/17 23:53

あと、人に尋ねるにはいくらなんでも知識が少なすぎる。言葉が通じない者にどうやって言葉で教えられる? 入門書くらいは読んでから来い。読むというのは文字を目で追うことじゃなく何が書いてあるかを理解することだ。
guest

0

つぎにこちらの問題ですが
*q = 0と書き込んでいるところで
0が文字列でいう終端'\0'と同じ意味なことが原因です

最初のループでstr[]がこう書き換わります
str[] = "str == NULL ? \"(NULL)\" ] : str"

str[] = "str == NULL \0 \"(NULL)\" ] : str"

str[] = "str == NULL \0 \"(NULL)\" ] \0 str"

こうなるとprintf()などの標準出力で出した場合
str[] = "str == NULL
と出力されます

c

1#include <stdio.h> 2#include <string.h> 3 4int main(void) { 5 char str[] = "str == NULL ? \"(NULL)\" : str"; 6 char* p, * q; 7 int ch; 8 p = str; 9 for (;;) { 10 for (q = p; !(*q == '?' || *q == ':' || *q == 0); q++); 11 ch = *q; 12 *q = 0; // この時点で str[] = "str == NULL \0 \"(NULL)\" ] str" 13 printf("|%s|\n", p); 14 if (ch == 0) break; 15 p = q + 1; 16 } 17}

投稿2021/02/15 22:19

DaiGuard

総合スコア159

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

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

carnage0216

2021/02/16 01:01

ありがとうございます。 一週目の時点で str[] = "str == NULL \0 \"(NULL)\" ] str"ということでしょうか?
DaiGuard

2021/02/16 01:25

最後のstrの前に:はついた状態だと思います str[] = "str == NULL \0 \"(NULL)\" ] : str"
carnage0216

2021/02/16 03:18

本当にごめんなさい、もっと細かく説明して頂けないでしょうか? またお時間があれば、同じ環境でデバッグしてほしいです。 環境はvisual studio 2019 winndous10 64bitです。
Zuishin

2021/02/16 03:24 編集

基礎が 0 なので、質問する前に入門書読んで文字列と配列の基礎を頭に入れた方が早いから。 読まない、読めないんだったら、文字列と配列の基礎についてイラスト付きで入門書よりもっと噛み砕いたレベルの解説が欲しいと言わないと、求めるものは回答者には通じない。普通 Q&A でそこまで想定してないし。
m.ts10806

2021/02/16 03:43

>同じ環境でデバッグしてほしいです。 デバッグ依頼はteratailでは非推奨行為。 https://teratail.com/help/avoid-asking ルール守れない人にプログラミングはできない。
guest

0

はじめまして

まずはわかりやすい方から
下のコードはpstrの先頭ポインタを渡しています
なのでpstrそのものと言えます
なので(*p) = str[i]になります ※iは○文字目を意味します
それに加算しているので 'a'+1='b', 'b'+1='c',...
みたいになっています

c

1#include <stdio.h> 2int main(void) { 3 4 char str[] = "abcde" ; 5 6 for (char* p = str; *p; ++p) // ここでstrの先頭ポインタをpに渡している 7 // ループが回るごとにpのポインタは1バイトづつ動く 8 { 9 ++(*p);  // (*p) -> str[i] なのでstr自体を書き換えている 10 printf("%s\n", &(*p)); 11 } 12 13 14 15}

投稿2021/02/15 21:59

DaiGuard

総合スコア159

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

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

carnage0216

2021/02/15 22:02

ありがとうございます。 何となく私でも理解できました。ですが疑問があります。 char* p = str;よりstr自体が書き換えられていることはわかりました。ですが、 質問の一番目のプログラムでは char str[] = "str == NULL ? \"(NULL)\" : str"; の中身は "str == NULL ? \"(NULL)\" : str" 一回目のループで中身はstr == NULL ? \"(NULL)\" : str、二回目のループでstr == NULL 三回目のループでstr == NULLとなんだか想像したのと違った結果になります。 要はstr自体が書き換えられるはずなのにずっとループ中は一定の文字列しかでないのがなぜなのかわからないのです。
DaiGuard

2021/02/15 22:13

こちらは別の回答に上げますね
carnage0216

2021/02/15 22:15

ありがとうございます。 あと、別の解答にあげるとはどういうことでしょうか。。。
DaiGuard

2021/02/15 22:21

ここのコメント欄だとコードブロックが表示できないので 別の回答としてもう一度、投稿させてもらいます 分かりにくくてすみません
carnage0216

2021/02/15 22:23

いえ、ありがとうございます。
m.ts10806

2021/02/16 00:48 編集

回答編集すればよいのでは。 「ベストアンサーを選ぶ」という性質上、同一質問で同一回答者の連動する回答がバラけるのは問題です。
carnage0216

2021/02/16 00:51

他の皆さんも回答を新しくする方が見やすいので行っていることですし、「問題」というほど大袈裟なんものではないですよ!
m.ts10806

2021/02/16 00:59

あなたには言ってませんし息を吸うようにマルチポストしてルール破るような人に判断できるとは思えません。
carnage0216

2021/02/16 03:24

なぜ++(*p);  // (*p) -> str[i] となるのでしょうか? str[i] <- (*p) とかで代入するならわかるのですが、 どうしてもstr自体を書き換えているプログラムと流れが摘まめません、
m.ts10806

2021/02/16 03:41

コメントあっちこっち散らばってるのにそれでも「見やすくなる」と言える根拠がわかりませんね。コードの同じくとっ散らかってる。 やはりマルチポストが生き甲斐の人の考えは理解できないな。マルチタスクできてないけど
guest

0

char* p = str[]より、str[]の中身はpに代入しているためstr[]に影響はないと思ったのですが。

char* p = str; ですね
ナカミはコピーされません。
アドレスが代入されてるだけなんで、ナカミを指してる変数がp になっただけです

pにより操作したら、strも変わります

投稿2021/02/15 22:04

y_waiwai

総合スコア88038

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

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

carnage0216

2021/02/15 22:13

ありがとうございます。 ですが、char* p, * q;と定義したため、pはアドレスの値を扱うのですよね? だとしたら、文字列を値として扱っているのですか? だとしたらp = str;は文字列をpはアドレスの値のメモリに入れているわけですか?
y_waiwai

2021/02/15 22:22

文字列のアドレスを扱ってます p=str は、アドレスを代入してるだけ。文字列かどうかはここでは関係ない
carnage0216

2021/02/16 00:48

そうでした。strの文字列の文字コードの入っているアドレスの先頭をポインタpのアドレスに代入しているだけでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問