2017-06-07 11 views
-4

私は2つの文字配列を持っています。私はstrcat関数を使用して両方の文字列を連結しようとします。 文字列「a」の長さが9から6に減少しました。 文字列「a」も失われました。文字列bも変更されました。出力を参照してください。なぜこれが起こっているのですか?なぜstrcat関数を使用した後にorignal文字列が変更されたのですか?

before:- 
len of a is 9 
len of b is 13 
len of c is 3 
string a is = roomies!! 
string b is = hey kammo DJ 
string c is = = 

after:- 
len of a is 6 
len of b is 22 
len of c is 22 
string a is = mies!! 
string b is = hey kammo DJ roomies!! 
string c is = hey kammo DJ roomies!! 
+0

http://en.cppreference.com/w/cpp/string/byte/strcat – LogicStuff

+2

ため:

strcpy (c,b); strcat (c,a); 

か:

だから、むしろのようなものを書きたいですそれは 'strcat()'の機能ですか?あなたはドキュメンテーションのコンサルティングを考えましたか?ちょうど推測の代わりに? – EJP

+0

@EJPなぜchar配列 "a"が変わったのですか? char arrya "b"は変更する必要があります。 –

答えて

3

「転送先配列は、srcとdestのと終端のNULL文字 両方の内容に十分な大き でない場合の動作は未定義です。」

目的の配列は "a"と "b"の両方の内容を格納するのに十分な大きさではないため、 "a"文字列の変更につながる未定義の動作が発生します。

1

strcat on C++ reference

先の文字列に元の文字列のコピーを追加 - :ここ

は、私は、出力が

#include <bits/stdc++.h> 

using namespace std; 
int main() { 
    char a[]="roomies!!"; 
    char b[]="hey kammo DJ "; 
    char *c; 
    c=new char[50]; 
    cout<<"before:-\n"; 
    cout<<"len of a is "<<strlen(a)<<'\n'; 
    cout<<"len of b is "<<strlen(b)<<'\n'; 
    cout<<"len of c is "<<strlen(c)<<'\n'; 
    cout<<"string a is = "<<a<<'\n'; 
    cout<<"string b is = "<<b<<'\n'; 
    cout<<"string c is = "<<c<<'\n'; 
    c=strcat(b,a); 
    cout<<"\nafter:-\n"; 
    cout<<"len of a is "<<strlen(a)<<'\n'; 
    cout<<"len of b is "<<strlen(b)<<'\n'; 
    cout<<"len of c is "<<strlen(c)<<'\n'; 
    cout<<"string a is = "<<a<<'\n'; 
    cout<<"string b is = "<<b<<'\n'; 
    cout<<"string c is = "<<c<<'\n'; 
return 0; 
} 

を行っているものです。宛先の終了ヌル文字は、ソースの最初の 文字によって上書きされ、ヌル文字は、 の末尾に両方の宛先を連結して形成された新しい文字列に含まれます。

希望する結果を得るにはstd::stringを使用してください。

2

strcat()は、送信先文字列に送信元文字列を追加し、送信先文字列を返します。

char * strcat (char * destination, const char * source); 

だからあなたの声明

c = strcat(b,a) 

だから配列b、cは同じ値を持つことになります。 strcat()

EDIT: 「b」配列があふれているため「a」が変更されました。そのC + +のため、あなたは文字配列の代わりにstd::stringを使うことができます。 strcat specによると

std::string a = "hi" ; 
std::string b = "this is concat" ; 
std::string c = a + b ; 
+0

が見つかりました。私のorignalの質問はなぜ文字列 "a"が変更されたかです。 strcat関数を使用しています。 –

+0

@RakeshSharmaあなたはそれを取得しませんでした... strcatは新しい文字配列を返しません。 bは(aを付けることによって)変更されます。 – deviantfan

+0

@deviantfanなぜ "文字列" a "が変更されたのですか? –

1

機能strcatそれは即ち、変更dest点にメモリの内容を署名char *strcat(char *dest, const char *src)を有し、ここでdest点に文字列の末尾文字列srcの内容を追加します。このためには、が指すメモリが、ストリングsrcdestの両方を保持するのに十分な大きさである必要があります。 bで表されるメモリブロックは14バイト(つまり、長さは"hey kammo DJ " +1)ですが、追加の文字列は保持できないため、実際にはstrcat(b,a)の呼び出しでは未定義の動作が発生します。、

snprintf(c, 50, "%s%s", b, a); 
関連する問題