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

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

ただいまの
回答率

87.48%

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

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,838

score 130

#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


デバッグ画像

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2021/02/16 07:21

    >https://teratail.com/questions/322641#reply-447826
    >言語はcです。今後はタグにcのみにします。

    大ウソつき。自分が言ったことすら守れないってどういう神経ですかね。

    キャンセル

  • キャンセル

  • 退会済みユーザー

    2021/02/18 10:37

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 4

+1

はじめまして

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

#include <stdio.h>
int main(void) {

    char str[] =  "abcde" ;

    for (char* p = str; *p; ++p) // ここでstrの先頭ポインタをpに渡している
                                 // ループが回るごとにpのポインタは1バイトづつ動く
    {
        ++(*p);  // (*p) -> str[i] なのでstr自体を書き換えている
        printf("%s\n", &(*p));
    }



}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/02/16 09:59

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

    キャンセル

  • 2021/02/16 12:24

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

    キャンセル

  • 2021/02/16 12:41

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

    キャンセル

+1

つぎにこちらの問題ですが
*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 
と出力されます

#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;   // この時点で str[] = "str == NULL \0 \"(NULL)\" ] str"
        printf("|%s|\n", p);
        if (ch == 0) break;
        p = q + 1;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/02/16 12:18

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

    キャンセル

  • 2021/02/16 12:23 編集

    基礎が 0 なので、質問する前に入門書読んで文字列と配列の基礎を頭に入れた方が早いから。

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

    キャンセル

  • 2021/02/16 12:43

    >同じ環境でデバッグしてほしいです。

    デバッグ依頼はteratailでは非推奨行為。
    https://teratail.com/help/avoid-asking
    ルール守れない人にプログラミングはできない。

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/02/16 07:13

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

    キャンセル

  • 2021/02/16 07:22

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

    キャンセル

  • 2021/02/16 09:48

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

    キャンセル

-8

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

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

1周目

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

2周目

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/02/18 08:26

    > 教え方が下手なくせによく言いますねえい!

    あなた以外からは 教え方が下手 と言われたことがないんよ。
    教わり方が下手 なんじゃないですかあなた。

    キャンセル

  • 2021/02/18 08:49

    kazuma-s さんの教え方がいちばん分かりやすいと常々言っていますが、あなたの質問のほとんどは kazuma-s さんのコードの意味を尋ねるものということに気づいていますか?

    一番わかりやすいのではなく、動くコードをくれるから一番便利なんでしょう。

    わからないところは質問乱立させないで本人に聞け。

    キャンセル

  • 2021/02/18 08:53

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

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る