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