2017-04-13 9 views
0

cstringライブラリとcstringライブラリのいくつかの機能について知りました。関数strcpyを使用しようとすると、混乱する問題が発生します。誰かが最初のコードがうまくいかず、2つ目のコードが完全にうまく動作するのに対し、なぜ私に説明することができますか?strcpyとstrcatの問題

まずコード:

char *str1 = "hello"; 
    char *str2 = "hi"; 
    strcpy(str1, str2); 
    cout << str1; 

セカンドコード

char str1[] = "hello"; 
    char *str2 = "hi"; 
    strcpy(s1,s2); 
    cout << str1; 

私は、問題は、私は変数STR1を宣言したが、私はまだstr1があるときに、それが動作しない理由はわかりませんどのように推測しますポインタ。あなたは非constポインタchar* str1に(constである)"hello"リテラル文字列へのポインタを代入しているため

+1

C++ 11では、const以外の 'char *'に文字列リテラルを格納しているため、どちらも許可されません。あなたのコンパイラがそれらを起動すると警告/エラーが出る可能性があります。 – chris

+1

'std :: string'を使って、気にする必要はありません。 'char * str1 =" hello ";'はコンパイラのエラー/警告でなければなりません。あなたが1つを取得していない場合は、設定をする必要があります。 – NathanOliver

+0

[strncpyとstrcatは私が彼らがC++と思うように動作しません](http://stackoverflow.com/questions/29283567/strncpy-and-strcat-not-working-the-way-i-think-they-would- c) –

答えて

0

まず、声明char *str1 = "hello"はあなたに警告を与える必要があります。しかし、const char *str1 = "hello"を書いた場合、警告は消えますが、でなければならないので、strcpyでエラーが発生します。

の変数str1は、実際にはポインタ(ポインタではありません)です。このポインタは、コピー先の"hello"という名前で初期化されています。したがって、後でstr1の内容を上書きすることができます。 str1はポインタではなく配列です。ポインタが予想されるコンテキストで使用されると、ポインタ(配列の最初の文字のメモリ)にむしろ減衰します。

+0

回答が改善/修正されるように、ダウンボウティングの理由を挙げてください。 –

関連する問題