6

では、この小さなプログラムを見てみましょう

char s[20]="One";
strcat(s,"Two");
cout<<s<<endl;

ここで、最初はsの値は「One」であり、視覚的に表現する場合、これはsの値です。

O --n --e-\ 0

次に、文字列の最後に「Two」を追加して、これを生成します。

O --n --e --T --w --o-\ 0

ご覧のとおり、最初は文字列のnullは「One」の後にあり、現在は「OneTwo」の後にあります。

私の質問は次のとおりです。nullは文字列「Two」で上書きされ、最後に独自のnullが追加されます。

それとも、最初にすでに存在していたnullが、再び最後に戻るように戻されたのでしょうか。

(この質問は違いがないように見えるかもしれませんが、私が学んだことすべてについて知りたいです)

ありがとうございました

4

4 に答える 4

12

最初の\0ものは上書き\0され、連結された文字列の最後に新しいものが追加されます。ここには何かを「移動」する余地はありません。これらは、値が割り当てられる場所です。

于 2012-08-06T19:31:41.037 に答える
4

質問は正しく繰り返し回答されていますが、source™から最も公式な回答を得るのは良いことかもしれません。または、少なくとも私がグーグルで見つけることができる情報源から。

このドキュメントは、C ++標準(またはその作業ドラフト)であると主張しており、次のように述べています。

C ++標準ライブラリは、Cライブラリ[strcatを含む]から209個の標準関数を提供します。-「標準Cライブラリ」、C.2.7、811ページ

C国際規格であると主張するこの文書にジャンプすると、次のようになります。

このstrcat関数は、が指す文字列のコピーs2 (終了ヌル文字を含む)を、が指す文字列の末尾に追加しますs1。の最初の文字はs2 、の末尾のヌル文字を上書きしますs1。オーバーラップするオブジェクト間でコピーが行われる場合、動作は定義されていません。

-「strcat関数」、7.21.3.1、327ページ

strcatは実際にヌル文字を上書きします。

于 2012-08-06T20:02:08.220 に答える
2

はい、\0の最初の引数のstrcatは上書きされ、連結された文字列の最後の文字になります。

それ自体は移動せず、関数は連結された文字列の最後の文字として追加 するだけです。\0

于 2012-08-06T19:31:22.717 に答える
2

確実に知る唯一の方法は、の特定のバージョンのソースを調べることですstrcat。通常の実装では、最初のnullを上書きし、nullを2番目の文字列から最後の位置にコピーします。

ただし、これは非常に難しいことですが、どちらの方法を使用しても、出力の違いを検出することはできません。

于 2012-08-06T19:34:16.673 に答える