2011-10-25 20 views
0

私はCスタイルの文字列のコピーをしようとしていますが、何かが正しく動作していません。私は間違って何をしていますか?基本的なCスタイルの文字列コピー

#include <iostream> 
using std::cout; 
using std::cin; 
using std::endl; 
int main() { 
    char string_a[20]="Good day!"; 
    char string_b[30]="Hi!"; 
    int i=0; 
    cout << "string a: " << string_a << endl; 
    cout << "string b: " << string_b << endl; 
    while (*string_a++ = *string_b++) { 
     cout << ++i << endl; 
    } 
    cout << "string a: " << string_a << endl; 
    cout << "string b: " << string_b << endl; 
    return 0; 
} 
+1

をあなたの中の単語やフレーズを追加する方が良いでしょう:

char *pa = string_a, *pb = string_b; // a "specific circumstance" :-) while (*pa++ = *pb++) { cout << ++i << endl; } 

それが出力する、うまく動作しますあなたの「回避策」の代わりに質問本体を使用してください。 –

+1

タイトルだけではこの問題には十分であったでしょうが、スタックオーバーフローではありません。あなたは少なくともそれが失敗したという理由で言及することができました。 –

+0

2つの問題があります。 'string_a'と' string_b'をポインタではなく配列として宣言しました。したがって、それらのアドレスは不変なので、 'string_a ++'と 'string_b ++'はエラーを生成するはずです。また、結果をヌル文字とコピーして比較していることを明確にするために、while((x = y)!= '\ 0') 'と書く方が良いでしょう。一般に、 'if'または' while'条件としての単一の '= 'は赤いフラグです。 –

答えて

2

あなたは行うことはできません。

string_a++ 

string_a配列として定義されている場合。これは、ポインタと配列に対してのみ機能し、特定の状況でのみポインタを消滅させます。

を変更した場合:

while (*string_a++ = *string_b++) { 
    cout << ++i << endl; 
} 

をへ:

string a: Good day! 
string b: Hi! 
1 
2 
3 
string a: Hi! 
string b: Hi! 
+0

iirc、配列はポインタですか、いいえ?どのように配列を可変ポインタとして宣言しますか? – user1011921

+0

@pax:これは私のお気に入りのインタビューの質問の1つでした。 :-) –

+3

NO、NO、NO、100回、NO :-)配列はポインタではありません。彼らは、特定の状況下ではポインタへの_decay_が、あなたが持っているコードスニペットには絶対にありません。 – paxdiablo