strcat 儆
조회수 751회
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
들로 채워져 있고, 이것이 한국어윈도우 환경에서儆
문자들의 연속으로 출력되는 것입니다.
댓글 입력