2012-04-15 16 views
0

私はいくつかの既存のコードを見て、いくつかのprintf行を追加しました。出力された文字列のCP「TZ =テストは」文字列を ' 0'に設定する

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つのテストを理解するが、なぜ第1印刷「の試験は、」* CPに設定されていてもい'\ 0'の直前ですか?

+0

何を印刷すると思いますか? –

答えて

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 
2

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

はここでCPは前のように見えたものです:

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

、ここでは

 テスト
後だ^^^^^^^^

最初の文字のみを上書きしました。

2

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

2

文字列の最初の文字のみを\0に設定しているためです。残りのメモリは変更されません。したがって、*cp + 1から印刷すると、\0Testではなく、Testからの印刷が開始されます。それは割り当てを回避するための素晴らしい方法ですので、それは、それに影響されない後\0はC.

何で文字列の末尾の文字であるため、\0に文字を設定

2

は、この時点でその前に文字列を終了します区切り記号を\0に置き換えて、最初の部分を取得するために文字列の先頭に元のポインタを使用し、後半部分を取得するためにsep + 1を使用するだけで、文字列を分割するときのメモリが増えます。

関連する問題