문자열 붙이는중 쓰레기값이 왜튀어나오는지 궁금합니다

조회수 905회
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {

    char* szBuffer = (char*)calloc(10,1);
    //memset(szBuffer,0,10);
    scanf_s("%s", szBuffer,_msize(szBuffer));

    int length = strlen(szBuffer);


    char* szNewBuffer = (char*)calloc(10,1);
    //memset(szNewBuffer, 0, 10);
    scanf_s("%s", szNewBuffer,_msize(szNewBuffer));
    int length2 = strlen(szNewBuffer);

    if (length + length2 > _msize(szBuffer)-1) {
        realloc(szBuffer, length + length2);

        if (szBuffer == NULL) {


            printf("할당실패");

        }

        else {
            printf("할당성공");
            memcpy(szBuffer + length,szNewBuffer,length2);
            puts(szBuffer);



        }
        free(szBuffer);
        free(szNewBuffer);
        return 0;

    }

    printf("%s\n", szBuffer);
    printf("%s\n", szNewBuffer);
    memcpy(szBuffer + length ,szNewBuffer,length2);
    printf("%s", szBuffer);

    free(szBuffer);
    free(szNewBuffer);


    return 0;
}
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 밑에서 6번째 줄에 있는 코드가 문제입니다.

    memcpy(szBuffer + length ,szNewBuffer,length2);
    

    위의 코드를 아래와 같이 바꾸세요.

    memcpy(szBuffer + length, szNewBuffer, length2 + 1);
    

    strlen() 함수는 문자열 마지막의 널문자까지 세지 않습니다. 따라서 length2에는 널문자를 제외한 순수 문자의 길이가 들어가 있고, memcpy() 실행시 널문자 앞까지의 글자만 복사가 되서 뒷부분의 쓰레기값들이 마구 출력된 것입니다. 메모리상의 우연찮게 존재할 0을 만날 때까지요. 따라서 +1을 해서 널문자까지 복사될 수 있도록 고쳐주세요.

    • 결과(수정 전)

    이미지

    • 결과(수정 후)

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 은혜를 입습니다 감사합니다 알 수 없는 사용자 2021.2.6 05:22
    • 근데 calloc 이용해서 0초기화 해놓은 상태인데도 그런건가용.. 알 수 없는 사용자 2021.2.6 06:52
    • 맨 처음에 calloc 함수를 사용한 직후에는 szBuffer가 0으로 초기화가 되었으나, 그 바로 밑줄의 scanf_s 함수를 사용하고 나면 %s로 입력받은 것을 저장하고 그 뒷부분이 0이 아닌 값으로 바뀔 수 있습니다. 제환경에서는 %s 부분의 뒷부분이 모두 -2로 바뀌네요. 이해가 잘 안되시면 아래의 코드를 calloc 바로 밑줄에 한번 추가하시고, scanf_s 바로 밑줄에도 추가한 후에 결과를 보시면 이해가 되실거에요. for (int i = 0; i < _msize(szBuffer); ++i) printf("%d\n", szBuffer[i]); 알 수 없는 사용자 2021.2.6 22:45
    • 정말 감사합니다 이해가 되었씁니다 알 수 없는 사용자 2021.2.8 05:58

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)