Jiyong's STUDY

strcpy strncpy 설명, 비교 본문

프로그래밍/C

strcpy strncpy 설명, 비교

Kingjiyong 2018. 5. 14. 17:47

문자열을 복사하는 함수 strcpy, strncpy


#include <string.h>

char *strcpy(char *dest, cont char *src);


int main(){

char str1[20]="Hello World";

char str2[20];

strcpy(str2, str1);

puts(str2);

}

결과 >> Hello World


strcpy는 두 인자를 받아 두번째 인자에 저장된 문자열을 첫번째 인자로 복사한다.

이 함수에서 보면 str1의 저장된 내용을 str2로 복사했음을 알 수 있다.


하지만 strcpy는 사용시 위험이 있는데


int main(){

char str1[20]="Hello World";

char str2[5];

strcpy(str2, str1);

puts(str2);

}

결과 >> Hello World


대충 보면 제대로 작동하는 것처럼 보일 수 있으나

str2에 저장된 값은 "Hello"이다.

어떤 의미이냐면 str2가 할당되어야 할 메모리 공간 뒤에 (어떤 것이 할당되어 있는지는 모름)

남은 World \0 이 저장되었다는 의미이므로 어떤 오류가 나타나도 이상하지 않다.

그래서 사용하는게 strncpy이다.


#include <string.h>

char *strncpy(char *dest, const char *src, size_t n); // size_t -> typedef unsigned int size_t


int main (){

char str1[20]="Hello World";

char str2[5];

strncpy(str2, str1, sizeof(str2));

puts(str2);

}


strncpy과 strcpy의 다른점은 마지막에 복사를 받을 문자열의 길이를 인자로 받는다.


결과 >> Hello%


이 또한 제대로 작동하는 것으로 볼 수 있으나 % 가 있는 걸 봐선 문제가 있다.

그 이유는 문자열의 마지막에는 문자열의 마지막을 알리는 널 문자가 있어야 하지만

길이가 5인 배열인 str2가 strncpy를 거쳐 5개의 문자로 가득 찼기 때문이다.

이런 식의 복사에 문제가 있는 것은 아니지만, 출력을 하기 위한 목적으로는 문제가 있다.


int main (){

char str1[20]="Hello World";

char str2[5];

strncpy(str2, str1, sizeof(str2);

str2[sizeof(str2)-1]='\0';

puts(str2);

}


결과 >> Hell


이 코드에서는 str2의 마지막 공간에 널 문자를 대입하여 정상적인 출력이 되었다.


strcpy와 strncpy중 어떤 것을 사용할지는 프로그래머의 재량이다.

strncpy를 사용하는 것이 더 안정적이라고 하지만, 

배열의 길이를 넉넉하게 한다면 strcpy를 사용하는 것이 더 편할 수도 있다.

알아서 문제가 생기지 않도록 사용하도록 하자.

'프로그래밍 > C' 카테고리의 다른 글

strcmp, strncmp 설명, 비교  (0) 2018.05.15
strcat, strncat 설명, 비교  (0) 2018.05.15
scanf gets fgets 문자열 입력 비교  (0) 2018.03.19
비트시프트연산  (0) 2018.03.19
강제형변환  (0) 2018.03.19