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

아마도이 제목만으로도이 문제를 해결할 수 있었지만 ... 스택 오버플로가 아닙니다. 적어도 실패했다고 언급 할 수 있습니다. –

+0

두 가지 문제가 있습니다. 'string_a'와'string_b'을 포인터가 아니라 배열로 선언했습니다. 따라서 주소가 변경되지 않으므로'string_a ++'와'string_b ++'는 에러를 발생시킵니다. 또한, while ((x = y)! = '\ 0')'을 써서 결과를 복사하여 null 문자와 비교한다는 것을 명확히하는 것이 더 좋습니다. 일반적으로,'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, 100 번, NO :-) 배열은 포인터가 아닙니다. 그들은 특정 상황에서 포인터를 가리킬 수 있지만 코드 스 니펫에서는 그렇지 않습니다. – paxdiablo