2017-05-17 6 views
1

私はCスタイル文字列にstd::stringを変換するためにc_str()を使用していたが、私はc_str()が想定しているNULL終端で上書き最後の文字を見ていない上にアレイ状に表示されませんでしたこのプログラムに追加します。私はそこにNULL終端を期待していたとしてdが印刷(cに追加)されている理由私が求めています何ヌル終端はstrcpyの-INGの

#include<iostream> 
#include<string> 
#include<cstring> 

using namespace std; 

int main() 
{ 
    string s = "helloworld"; 
    char c[10]; 
    strcpy(c, s.c_str()); 
    cout << c << endl; 
    return 0; 
} 

です。私はここで何が欠けていますか?

+4

は 'strcpy'は、それが書き込み文字列*後ターミネータ*を置きます。バッファーが小さすぎる場合は、それが問題です。 –

答えて

1

文字列をコピーする配列cは、ヌルターミネータに十分な領域を割り当てないため、コードには未定義の動作があります。

コピーする文字数は10です。ヌルターミネータを使用するには、11の配列が必要です。

代わりに動的割り当てを使用して、静的に割り当てられた配列を持つようなオーバーランのトラブルを避けるために:

char *c = new char[s.size()+1]; 
strcpy(c, s.c_str()); 
cout << c <<endl; 
delete[] c; 
1

定義されていない動作があります。"helloworld"は実際には"helloworld\0"、つまり11文字です。 strcpyはNULを含む文字列全体をコピーしようとしますが、cは10文字しか保持できません。

0

strcpyターゲット配列の長さはわかりません。これは、終了する0バイトまでコピーします。したがって、文字列全体の文字列helloworld\0がコピーされます。これは11文字で、クラッシュする可能性もあります。