Jiyong's STUDY
strcpy strncpy 설명, 비교 본문
문자열을 복사하는 함수 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 |