2017-03-08 10 views
-2

그래서 두 개의 문자 배열을 연결하여 오버로드 된 연산자로 반환하려고합니다. 그러나 strcat은 가치가 떨어지고 컴파일되지 않을 것이고 누군가 strcat_s가 특정 OS라고 말했습니다. 이 두 남자를 연결하는 방법에 대한 아이디어?strcat를 사용하여 문자 배열을 연결

MyString operator+(MyString lhs, MyString rhs) 
{ 

MyString m3(lhs._size + rhs._size + 1); 
strcat(m3._data, lhs._data); 
strcat(m3._data, rhs._data); 
return m3; 


} 
+0

음, 모든 플랫폼에서 당신은 strcat와를 사용할 수 있으며, Windows에서 당신이 원하는 경우 strcat_s를 사용하거나 그냥 경고를 strcat와를 사용하여 경고를 무시하거나 사용하지 않도록 설정할 수 있습니다. 그래도 코드에는 다른 버그가 있습니다. – immibis

+0

그럼 strcat을 사용하면 그 목적을 이길 수 있습니까? –

+1

어떻게 컴파일하지 않습니까? 어떤 오류 메시지가 나타 납니까? –

답변

-2

_data은 초기화하지 않은 것이 문제입니다. strcat()의 첫 번째 인수는 null로 끝나는 문자열이어야하지만 초기화되지 않은 배열을 제공합니다.

MyString operator+(MyString lhs, MyString rhs) 
{ 
    MyString m3(lhs._size + rhs._size + 1); 

    strcpy(m3._data, lhs._data); 
    strcat(m3._data, rhs._data); 
    return m3; 
} 

또는 당신은 _data를 초기화 할 수 있습니다 :

가 첫 번째 문자열을 복사하려면하지 strcat(), strcpy() 사용

MyString operator+(MyString lhs, MyString rhs) 
{ 
    MyString m3(lhs._size + rhs._size + 1); 

    m3._data[0] = '\0'; 
    strcat(m3._data, lhs._data); 
    strcat(m3._data, rhs._data); 
    return m3; 
} 

아니면 크기를 가지고 있기 때문에 당신이 주소 연산 및 memcpy을 사용할 수 있습니다 .

MyString operator+(MyString lhs, MyString rhs) 
{ 
    MyString m3(lhs._size + rhs._size + 1); 

    m3._data[m3._size] = '\0'; 
    memcpy(m3._data, lhs._data, lhs._size); 
    memcpy(m3._data+lhs._size, rhs._data, rhs._size); 
    return m3; 
} 
+0

좋아, 난 그냥 strcat의 depriciation 확실하지 않았다. 또한 포인터 arithmatic이 더 나은지 궁금하다. –

+0

포인터 연산과'strncpy()'를 사용할 수있다. – Barmar

+0

정말'새로운'입니까? 적어도 스마트 포인터를 사용하지 않습니까 ?? 그게 도움이되는거야? 새로운 엔지니어가 생산성을 높이기 위해 며칠, 몇 주, 몇 달을 기다려야합니다. –