C언어 \ C++
[C언어] 문자열(string)을 복사하는 함수 (문자열 메모리를 복사, strcpy, strncpy 함수)
안산드레아스
2022. 2. 27. 19:35
반응형
문자열 내장 라이브러리는 #include <string.h> 을 추가해야 있다.
문자열을 복사하는 내장 함수로는 아래 두가지가 있다.
함수의 원형.
char * strcpy(char * dest, const char * src);
char * strncpy(char * dest, const char * src, size_t n);
간단한 복사 예
#define _CRT_SECURE_NO_WARNINGS // visual studio 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>
int main()
{
// str1에만 값이 있고, str2는 초기화 값을 넣지 않음.
char str1[20] = "1234567890";
char str2[20];
// str1을 str2에 복사
strcpy(str2, str1);
// 출력확인
puts(str1);
puts(str2);
return 0;
}
(결과) str1의 값이 str2에 복사되어 출력이 가능한 것을 볼 수 있다.
** 그러나 메모리 침범의 결과를 만들 수 있는 strcpy보다, strncpy를 아래와 같이 사용하는게 안정적 코드를 만드는데 좋다.
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>
int main()
{
// str1에만 값이 있고, str2는 초기화 값을 넣지 않음.
char str1[20] = "1234567890";
char str2[20];
// str1을 str2에 복사 * 안전한 사용법 strncpy
strncpy(str2, str1, sizeof(str2));
// 출력확인
puts(str1);
puts(str2);
return 0;
}
반응형
아래 코드는 유도리 있게 딱 할당된 메모리 만큼만 복사하고 마지막에 NULL을 넣어 문자열을 끝낸다.
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>
int main()
{
// str1에만 값이 있고, str2는 초기화 값을 넣지 않음.
char str1[20] = "1234567890";
char str3[5];
// str1을 str3에 복사 * 안전한 사용법 strncpy
strncpy(str3, str1, sizeof(str3) - 1); // 맨 마지막자리만 빼고 복사를 하라! (Null이 들어갈 공간 마련하기 위해)
str3[sizeof(str3) - 1] = 0; // str[5-1] = str[4], 즉, 문자열의 마지막 자리에 0을 대입. 문자열을 끝냄.
// 출력확인
puts(str1);
puts(str3);
return 0;
}
(결과)
반응형