strcat 함수 구현
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.net
에구.. 잘못 봤슴돠.
www.gilgil.net
운동하고 오느라 못 봤습니다만ㅋㅋㅋ
이런 질문으로 헷갈리게 만들어 죄송합니다(_ _)
...
STRING[idx1] = temp.getString()[idx1++];
하나의 변수에 대해 ++ 연산을 하면서 같은 statement 안에서 그 변수를 또 사용하는 것은 정의되지 않은 동작입니다. 앞의 idx1이 무슨 값을 읽을지 보장되지 않습니다.
C 공부가 부족했군요ㅠㅠ C책을 다시 펼쳐
C 공부가 부족했군요ㅠㅠ C책을 다시 펼쳐 보겠습니다…….
위에 jick님이 말씀하신 내용이 굉장히 중요하긴
위에 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만 출력이 됩니다.
감사합니다! 한 방에 해결됐슴다! 는 이것도 결국 C
감사합니다! 한 방에 해결됐슴다! 는 이것도 결국 C 공부군요ㅠㅠㅠㅠ
댓글 달기