2011-10-25 62 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

這將是更好的詞和詞組在您的問題的身體,而不是你的「解決方法」。 –

+1

也許標題本身就足以解決這個問題...但是,不是堆棧溢出。你至少可以提到_why_它失敗了。 –

+0

兩個問題。你已經將'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; 
} 

到:

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

那麼它會工作得很好,輸出:

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

iirc,數組是指針,不是?你如何將數組聲明爲可變指針? – user1011921

+0

@pax:這曾經是我最喜歡的面試問題之一。 :-) –

+3

NO,NO,NO,一百次,NO :-)數組不是指針。他們_decay_指針在某些情況下,但絕對不在你有的代碼片段。 – paxdiablo