해결된 질문
작성
·
128
·
수정됨
2
https://www.inflearn.com/questions/445486
이 질문의 답변에서
strncpy는 복사 하려는 공간이 복사 대상보다 클 경우 null value로 채워주는 것으로 알고 있습니다.
라고 말씀을 해주시는데
그러면
char dest[100] = ""; // make sure memory is enough
char source[] = "Start programming!";
strcpy(dest, source);
strncpy(dest, source, 5);
이걸 실행 했을 때 Start만 출력이 되어야 하는 거 아닌가요?
근데 교수님은 Start가 복사 될 때 복사 될 문자열에 NULL 캐릭터가 없어서
위의 예제를 실행하면 Start programming!가 전부 출력 된다고 말씀하셨고 실제로 그렇게 됐잖아요
교수님 말씀이 맞는건지 아니면 제가 답변자님 답변을 잘못 이해한 것인지 잘 모르겠네요
source가 들어갈 dest에 이미 데이터가 들어가 있어서 나머지 공간을 NULL 캐릭터로 채워주지 않은거라고 해석해도 될까요?
그리고 Start programming!이 전부 출력되는 이유를 제가 강의를 듣고 나름대로 설명해 봤는데 이게 맞는지 모르곘네요.
위의 예제를 실행시키면 "Start”만 출력을 할 것 같지만
"Start programming!" 전부를 출력하는데 그 이유는
strncpy() 함수에서 원본을 복사해서 넣을 때 복사본의 맨 마지막에
NULL 캐릭터를 추가해주지 않고 문자열을 복사해서 넣어줄 공간만 신경 쓰지 그 외의 공간은 신경 쓰지 않기 때문이다.
(dest에서 Start가 들어갈 공간만 신경 쓰지 나머지 공간은 신경 쓰지 않는다는 뜻)
라고 설명을 해봤어요
답변 1
2
안녕하세요, 질문&답변 도우미 Soobak 입니다.
교수님의 말씀이 정확합니다.
이전 질문&답변 도우미분의 말씀도 맞지만, 질문과 연관되지 않습니다.
강의에서 교수님의 설명처럼, strcpy()
함수와 strncpy()
함수는 문자열 뿐만 아니라 메모리와 관련된 동작을 위해서도 사용되는 경우가 있기 때문에, 복사 후 남은 dest
의 부분에 '\0'
을 자동으로 추가해주지 않습니다.
char dest[100] = "";
char source[] = "Start Programming!";
strncpy(dest, source, 5);
puts(dest);
: strncpy()
가 수행된 후 Start
까지만 정상적으로 출력된 이유는,
이미 char dest[100] = "";
부분에서 배열의 나머지 부분이 '\0'
문자들로 초기화되어있었기 때문입니다.strncpy()
함수가 '\0'
문자를 추가해준 것이 아닙니다.
strncpy는 복사 하려는 공간이 복사 대상보다 클 경우 null value로 채워주는 것으로 알고 있습니다.
: strncpy()
함수에서 '복사 하려는 공간의 크기' 는 인수로 전달되는 n
입니다.
'복사 대상의 크기' 는 예시 코드에서 source
배열의 크기 입니다.
따라서, strncpy(dest, source, 5);
의 경우와는 다른 경우에 대한 설명입니다.
strncpy()
함수는 오직 n
이 source
의 길이보다 클 때의 경우에 대해서 남은 부분을 '\0'
으로 채웁니다. n
이 source
의 길이와 같거나 작은 경우에는 dest
의 나머지 부분에 대해 아무런 조치를 취하지 않습니다.