strcat 함수 구현

vi08의 이미지

void MyString::myStrcat(const char* str)
{
MyString temp;

if(STRING != NULL)
{
temp = STRING;
STRING = NULL;
delete[] STRING;
}

int STRING_SIZE = myStrlen(temp.getString()) + myStrlen(str) + 1;
STRING = new char[STRING_SIZE];
memset(STRING, 0, STRING_SIZE);

int temp_size = myStrlen(temp.getString()) + 1;

int idx1 = 0, idx2 = 0;

while ( idx1 < STRING_SIZE )
{
if( idx1 < temp_size )
STRING[idx1] = temp.getString()[idx1++];
else
STRING[idx1++] = str[idx2++];
}

STRING[STRING_SIZE - 1] = '\0';
}

strcpy, strcmp, operator=, operator== 등의 기능은 구현을 했습니다만, strcat 함수 구현 중 문제가 발생했네요.

대충 "Hello_World"라는 문자열을 만들고자 했슴다. 그리고 "Hello"까지 무난히 대입 연산이 됐고요.

그런데 나머지 else의 str, "_World" 부분은 대입 연산이 이뤄지지 않았는지 결과가 자꾸만 Hello로 나오네요ㅋㅋㅋ;

while 문의 else 구문 인덱스부터 STRING에 대입 연산이 안 되는 상황입니다. 대체 뭐가 문제인지 알고 싶습니다-_-ㅋ

저도 프로그래밍의 입문이라는 Hello World를 꼭 한 번 출력시켜 보고 싶어요!

gilgil의 이미지

에구.. 잘못 봤슴돠.

vi08의 이미지

이런 질문으로 헷갈리게 만들어 죄송합니다(_ _)

jick의 이미지

STRING[idx1] = temp.getString()[idx1++];

하나의 변수에 대해 ++ 연산을 하면서 같은 statement 안에서 그 변수를 또 사용하는 것은 정의되지 않은 동작입니다. 앞의 idx1이 무슨 값을 읽을지 보장되지 않습니다.

vi08의 이미지

C 공부가 부족했군요ㅠㅠ C책을 다시 펼쳐 보겠습니다…….

익명 사용자의 이미지

위에 jick님이 말씀하신 내용이 굉장히 중요하긴 한데
(sequence point로 검색해 보십시오. 정말 중요한 내용입니다.)

일단 직접적인 원인은
int temp_size = myStrlen(temp.getString()) + 1;
여기에 안들어가야 할 + 1가 들어갔기 때문입니다.
temp에서 널 문자열까지 복사를 하기 때문에
그 뒤에 옮겨 쓰여진 부분은 무시가 됩니다.

예를 들어 hello + _world를 한다고 하면
STRING_SIZE는 5 + 6 + 1이 될테고
temp_size는 5+1
temp에서 옮겨 쓰여지는 내용은 hello'\0'
그 뒤에 str에서 옮겨 쓰여지는 내용은 _world(널문자가 안 옮겨짐)
그리고 맨 마지막의 d가 '\0'으로 덮여 쓰여지네요.
최종적으로 완성되는 문장은
"hello\0_worl\0"
이걸 printf등으로 출력하면 널문자 이전의 hello만 출력이 됩니다.

vi08의 이미지

감사합니다! 한 방에 해결됐슴다! 는 이것도 결국 C 공부군요ㅠㅠㅠㅠ