0

私はいくつかの既存のコードを見ていて、いくつかのprintf行を追加しました。文字列cp"TZ=test"があります

cp = strchr(str, '=');
printf("Text: %s\n",cp);
printf("Text cp+1: %s\n",cp+1);
*cp = '\0';
printf("Text: %s\n",cp);
printf("Text cp+1: %s\n",cp+1);

出力は次のとおりです。

Text: =test
Text c+1: test
Text:
Text c+1: test

最初の2つのテストは理解しましたが、直前に*cpが'\ 0'に設定されていても、4番目のテストで「test」が出力されるのはなぜですか。

4

5 に答える 5

3

他のいくつかの言語とは異なり、Cは文字列が何であるかを認識せず、文字列がどこで終了するかしか認識しないため、指定したポインタから出力します。

    [=test\0]
1:   ^start here
          ^ end at \0
2:    ^start here
          ^ end at \0

    [\0test\0]
3:   ^start here, it's \0, so stop
4:     ^start here
           ^ end at \0
于 2012-04-15T16:49:56.417 に答える
2

* cp+1を印刷しているためです。

以前のcpは次のようになりました。

=テスト
^^^^^^^^

そしてここに

 テスト
^^^^^^^^

最初の文字を上書きしただけです。

于 2012-04-15T16:49:21.730 に答える
2

cp[0]'\0'に設定するかどうかは関係ありません。cp+1あなたはまだ「テスト」である印刷しています。

于 2012-04-15T16:50:08.607 に答える
2

文字列の最初の文字を。に設定しているだけだから\0です。残りのメモリは変更されていません。したがって、からの印刷は、からではなくからの印刷を*cp + 1開始します。Test\0Test

于 2012-04-15T16:50:34.720 に答える
2

文字を に設定すると、C の文字列終了文字である\0ため、この時点でその前の文字列が終了します。\0

それ以降は影響を受けないため、セパレーターを置き換えて\0、文字列の先頭への元のポインターを使用して最初の部分を取得できるため、文字列を分割するときに追加のメモリを割り当てることを避けるための優れた方法です。 sep + 12番目の部分を取得します。

于 2012-04-15T16:51:18.910 に答える