2011-06-30 11 views
0
#include <iostream> 
#include <cstring> 
using namespace std; 
int main() { 
    char sor[6] = "hello"; 
    char des[6] = "hello"; 
    strcat(des,sor); 
    cout << des; 
} 

に何か問題があり、それは、コンソール出力(その背後にある)と一緒に次のエラーを与える: enter image description hereはプログラム

それがなぜそうなのか?コードに問題があれば、提案をお願いします。

+1

11以上の配列を使用する前に、 。これが叶うことを願う – asma

+0

これは宿題のように聞こえる。それは...ですか? –

+3

'std :: string'を使います。 –

答えて

4

文字列 char-arrayのサイズを大きくすると、このような場合に役立ちますが、実際にはC++機能を使用することを提案します。あなたがC++をコーディングしたい場合ではない、コードCの操作を行います。

#include <iostream> 
#include <string> 
using namespace std; 
int main() { 
    string sor = "hello"; 
    string des = "hello"; 
    des += sor; 
    cout << des; 
} 

をなぜ

Suhailがchar-配列が悪い理由を尋ねたのchar配列

ワンチャーアレイのために使用すべきではありませんまさにこのような状況のより多くの危険な状況が存在する。効果的には、C配列を使用している場合、プログラムがバッファオーバーフロー攻撃の対象となる危険性があります。

あなたは実際に例外を直接受け取ったことは非常に幸運でした。しかしあなたよりも頻繁にそれらのバグは微妙で、何日、何ヶ月、何年も自分自身を発見しません。おそらく、あなたの顧客は、ひび割れされ、顧客のクレジットカード情報を一般に公開することで、毎日のニュースに入ります。

またはstringstreamのようなC++機能を使用すると、これは簡単に回避できます。


+0

は、フレゼルに合意... – asma

4

Desは連結後の結果を保持するのに十分な大きさではありません。配列のサイズを大きくする必要があります。

+0

いいえ、彼は文字列を使用すべきではありません。 –

+0

oh..that大きな間違いでした –

+0

@ phresnelなぜ私はchar配列を使用すべきではないですか? –

1

desは6バイトのためだけのスペースがあり、あなたはそれに11バイト5 + 5 + 1に合うようにしようとしている。

'h'+'e'+'l'+'l'+'o'+'h'+'e'+'l'+'l'+'o'+'\0' 

(DESは自動変数であるため)、これはこれは、スタックを破壊につながります叫び声が働くが、すぐに復帰しようとするとプログラムがクラッシュする理由。 des[11]を宣言すると機能します。

0

配列を使用する前にメモリを割り当てようとします。これが役に立ちますようにお願いします。 Gunnerが提案したように、配列に入れるものの大きさに応じてメモリを割り当てようとします。

0

strcatは、最初のパラメータの最後に2番目のパラメータを追加します。つまり、あなたのケースでは、連結の合計長さは11文字になりますが、desには6を保持するのに十分な場所しかありません。des[6]からdes[11]に変更すると、プログラムは正常に動作します。 strcatの詳細については、thisリファレンスを参照してください。

0

strcarは文字列を連結します。これに十分なスペースがあることを確認する必要があります。 あなたの場合 - 連結された文字列に11文字(最後に10文字)がある場合、6文字のメモリを割り当てました