반응형

문자열 내장 라이브러리는 #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;
}

(결과)

 

 

반응형

+ Recent posts