2013-05-03 3 views
1

정적 char 버퍼 [50]를 사용하여 문자열 array1의 다른 동적 문자 배열의 끝에 문자열 array2의 동적 문자 배열을 추가하는 자체 추가 기능을 작성했습니다. 그러나 컴파일러는 다음 오류를 생성합니다. 'char'를 'char [50]'에 할당 할 때 호환되지 않는 유형의 [오류]. 문제를 파악하려고했지만 해결책을 찾지 못했습니다. 귀하의 도움은 매우 감사하겠습니다. Dev-C++을 사용하고 있습니다. 코드는 다음과 같습니다.추가 기능이 예상대로 작동하지 않습니다. C++

#include <iostream> 


using namespace std; 

char *Appendstring(char *a, char *b) // will append b to the end of a 
{ 
    static char buffer[50]; 
    char *p=buffer=*a++; //[Error] incompatible types in assignment of 'char' to 'char[50]' 
        //[Error] invalid conversion from 'char*' to 'char'[-fpermissive] 
    p--; 
    while(*p++=b++); 
    p--; //append 
    while(*p++=*c++); 
    return buffer; 


} 

int main() 
{ 

    string str="Displaying: "; 
    string add=" Summer is coming"; 

    Appendstring(str, add); 

    return 0; 
} 
+4

괜찮지 만'std :: string's에'operator + ='를 쓰지 않는 이유는 무엇입니까? –

+0

문자열 클래스와 그 멤버를 다시 구현하는 것은 C 또는 C++과 같은 저급 언어를 통해 학습하는 일반적인 방법입니다. 질문을 기각하기 위해 설명 된 작업에 대한 연산자가 있음을 지적하는 것과 관련성이 없습니다. –

답변

3

append 함수에 여러 오류가 있습니다. 가장 큰 함수는 배열을 포인터로 사용하고 정적 버퍼를 사용하여 문자열을 병합하는 것입니다. 정적 버퍼를 사용하면 병합 된 모든 문자열이 같은 공간에 있으므로 두 문자열을 병합 한 다음 다른 두 문자열을 병합하면 첫 번째 병합 결과를 덮어 씁니다! 다음과 같이

당신은 당신의 기능을 변경할 수 있습니다 호출자가 지금 Appendstring의 결과를 확보 할 책임이 물론

char *Appendstring(const char *a, const char *b) // will append b to the end of a 
{ 
    char *buffer = new char[strlen(a)+strlen(b)+1]; 
    char *p=buffer; 
    while(*p++=*a++); // Copy a into buffer 
    while(*p++=*b++); // Copy b into buffer right after a 
    *p=0; // Null-terminate the string 
    return buffer; 
} 

.

+0

오 오케이, 나는 내가 가진 모든 오류를 수정했다. 이제 코드가 제대로 작동합니다. 감사!!! – T4000

1

buffer=*a++에서하는 작업은 배열로 할당 할 수 없습니다. 정의되지 않은 동작에 이르게 - 당신이 의미하는 것은 당신이 전에 포인터를 배열의 시작을 하나 개의 요소 를 derefence하려고 아마 여기 또한

static char buffer[50]; 
char *p=buffer; 
*p=*a++; 

,

p--; 
while(*p++=*b++); 

입니다.

또한 문자열의 길이를 확인할 필요가 없으므로 쉽게 49 개 이상을 함께 사용할 수 있으며 코드가 정확하지 않을 수 있습니다 (buffer overflow 공격의 쉬운 희생자).

마지막으로 하나의 문제는 배열이 static 배열로 인해 어떤 방식 으로든 재진입이 불가능하다는 것입니다. 여기에 제안 된 것처럼 간단하게 배열을 사용하여 문자열의 길이에 맞게 조정하거나 동적으로 할당 할 수 있습니다.

물론 가장 좋은 해결책은 std::string을 사용하고 이러한 모든 문제를 잊어 버리는 것입니다.

관련 문제