strcat 儆

조회수 1197회

strcat함수를 구현하여 실행시키는데 자꾸 끝에 가 붙네요. 어디가 틀린 걸까요? 아 그리고 배열에 scanf_s 쓰면 안되던데 왜 그런 걸까요?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int strlen(char* a)
{
    int i=0;
    while (a[i] != '\0')
        i++;
    return i;
}
void strcat(char* b, char* c)
{
    int n = strlen(b), i;
    for (i = n; i < n + strlen(c); i++)
        b[i] = c[i - n];
}

int main(void)
{
    char s[50], e[50];
    scanf("%s", s);
    scanf("%s", e);
    printf("%d\n", strlen(s));
    printf("%d\n", strlen(e));
    strcat(s, e);
    printf("%s\n", s);
    return 0;
}

1 답변

  • c언어에서 스트링은 null-terminated-string 으로 구현합니다. char 의 배열에 문자를 차례대로 넣고, 마지막을 알리기 위해서 마지막 글자 뒤에 null ( 0x00 ) 을 넣어서 마무리 해 줍니다.

    현재 질문자가 구현한 strcat 에서는 s 배열의 뒤쪽에 e 배열의 한문자 한문자를 for 문으로 집어넣어 주지만, 마지막을 알려주는 null 을 넣어주지 않습니다. 그래서, 마지막을 알 수 없습니다.

    운이 좋은 경우에는 이미 s 의 뒤쪽이 0x00 으로 쭉 채워져 있어서, 마지막을 따로 알려주지 않아도 문제가 없겠지만, 실제 우리가 사용하는 메모리는 꼭 깔끔하게 0x00 으로 채워져 있지 않습니다. 그래서 질문자가 구현한 strcat 에서 마지막에 0x00 을 하나 더 넣어줘야 합니다.

    을 그냥 쓰레기값이라고 퉁치고 넘어가는데, 사실 왜 이 문자가 나오는지도 잘 이해하고 넘어가면 재미있습니다.

    는 cp949 인코딩으로 0xcccc 값에 해당하는 문자입니다. 그냥 쓰레기 값이라기에는 매우 예쁜 값인데, 왜 이런 값이 들어있느냐 하면, 비주얼스튜디오에서 debug 빌드를 할 때에는 스택변수의 배열을 0xcc 로 채워놓기 때문입니다.

    char s[50], e[50];
    

    이렇게 선언하면, s 로 잡힌 메모리에는 0xcc 가 50개 들어있게 된다는 말입니다. (release 빌드일 때에는 0x00 으로 채워놓을 겁니다.) 그렇기 때문에, 질문자의 코드에서 null 마무리를 하지 않았을 때에, 뒤쪽의 문자들이 0xcc 들로 채워져 있고, 이것이 한국어윈도우 환경에서 문자들의 연속으로 출력되는 것입니다.

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

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

(ಠ_ಠ)
(ಠ‿ಠ)