2012-08-06 7 views
6

には現在、最初のsで、この小さなプログラムC++:strcat()はnullを上書きまたは移動しますか?

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

を見ることができます値 "ワン" を持っているし、視覚的に表現するために、これはsの値である:

O - N - E - \ 0

そして、私はこれを生産する文字列の末尾に "二" を追加します。

O - N - E - T - ワット - O - \ 0

今、あなたが見ることができるよう"OneTwo"の後ろにある "One"の後の文字列の唯一のヌルです。

私の質問は です。文字列 "Two"でヌルを上書きし、最後にnullを追加します。

また、最初に既に存在していたヌルは、もう一度最後に移動しましたか?

(この質問は違いをしないように見えるかもしれないが、私は私が学ぶすべてについて知りたい)

はい、strcatの最初の引数の\0が上書きされます、そして、それはなったあなたに

+4

C++を使用している場合、 'strcat'は必要ありません。 'std :: string'と' + = 'を使ってください。 – Drise

答えて

12

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

2

ありがとうございました連結された文字列の最後の文字。

それはようではない移動を行い、機能だけで連結文字列の最後の文字として\0を追加します。

2

特定のバージョンのソースを確認するには、strcatが必要です。典型的な実装は、最初のヌルを上書きし、2番目の文字列のヌルを最後の位置にコピーします。

これは本当にニッピングですが、どの方法を使用しても出力の違いを検出することはできません。

4

質問は正しく繰り返して回答されていますが、source™から最も正式な回答を得るのは良いことかもしれません。少なくとも、私がGoogleで見つけることができるソースから。 C++標準(またはそのワーキングドラフト)であることを主張

This document、言う:

C++標準ライブラリが[STRCAT含む] C ライブラリから209の標準機能を提供します。 - 「標準Cライブラリ」、C.2。7、PG C国際標準であると主張するthis documentに飛び越え811

は、我々は、次を参照してください。

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

- "strcat機能"、7.21.3.1、PG 327

strcatのは確かにヌル文字を上書きしません。

関連する問題