본문 바로가기

강의자료/C/C++

050. 문자열 함수를 직접 만들어보자.


◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


#include  
#include 
#include 
using namespace std;

void my_strcpy_s(char* dest, int countofdest, char* src)
{
	int srclength = strlen(src);
	assert(countofdest > srclength && "buffer is too small.");

	for(int i=0; i < srclength+1; i++)
	{
		dest[i] = src[i];
	}
}

void my_strncpy_s(char* dest, int countofdest, char* src, int copylength)
{
	assert(countofdest > copylength);

	for(int i=0; i < copylength; i++)
	{
		dest[i] = src[i];
	}

	dest[copylength] = '\0';
}

void my_strcat_s(char* dest, int countofdest, char* src)
{
	int destlength = strlen(dest);
	int srclength = strlen(src);
	assert(countofdest > destlength+srclength);

	for(int i=0; i < srclength+1; i++)
	{
		dest[destlength+i] = src[i];
	}
}

void my_strncat_s(char* dest, int countofdest, char* src, int copylength)
{
	int destlength = strlen(dest);
	assert(countofdest > destlength+copylength);

	for(int i=0; i < copylength; i++)
	{
		dest[destlength+i] = src[i];
	}

	dest[destlength+copylength] = '\0';
}

int my_strcmp(char* left, char* right)
{
	if(strlen(left) != strlen(right)) return -1;

	int length = strlen(left);
	int compare = 0;

	for(int i=0; i < length; i++)
	{
		compare = left[i] - right[i];
		if(compare != 0) break;
	}

	return compare;
}

void my_sprintf_s(char* buffer, int countofbuffer, char * format, ...)
{
	// 가변인자로부터 문자열 얻기.
	va_list args;

	// 시작.
	va_start( args, format );
	// 문자열을 buffer에 입력한다.
	vsprintf_s( buffer, countofbuffer, format, args );
	// 끝.
	va_end( args );
}

int add_number (int start, ... ) 
{ 
	va_list ap; 

	// 가변인자 시작위치 설정하고 인수 목록을 초기화한다.
	va_start (ap, start); 

	//for (i = 0; i < count; i++) 
	//	sum += va_arg (ap, int); 

	while(true)
	{
		// 다음 인수값을 얻어온다.
		int num = va_arg (ap, int);
		if (num == -1) break;
		start += num;
	}

	// 정리한다.
	va_end (ap); 

	return start; 
}

int main( )
{
	char src[] = "MBC 아카데미 디지털 교육원";
	char dest[128];

	// 문자열 복사.
	my_strcpy_s(dest, _countof(dest), src);			// 버퍼가 작을 경우, 런타임 에러 발생.
	cout << dest << endl;

	// 문자열의 일부만 복사.
	strncpy_s(dest, _countof(dest), src, 12);		// 12글자만 복사.(시작주소를 변경하여 원하는 글자를 복사할 수 있다.)
	//strncpy_s(dest, _countof(dest), src+4, 8);	// "아카데미"
	cout << dest << endl;

	char str1[128] = "MBC 아카데미 ";
	char str2[] = "디지털 교육원";

	// 문자열 합성.
	strcat_s(str1, _countof(str1), str2);
	cout << str1 << endl;

	// 문자열의 일부만 합성.
	strncat_s(str1, _countof(str1), str2, 6);		// 한글 1글자를 2글자로 해석한다.
	cout << str1 << endl;

	// 문자열 비교.
	int ret = strcmp(src, str1);
	if(ret == 0) cout << "같은 문자열." << endl;
	else cout << "다른 문자열." << endl;

	// 문자열 포맷 생성.
	char gugu[] = "구구단";
	int dan = 5, row = 2;
	sprintf_s(dest, _countof(dest), "%s : %d x %d = %d", gugu, dan, row, dan*row);
	cout << dest << endl;

	// 이 호출은 16을 출력한다.
	cout << add_number (5, 5, 6, -1) << endl;

	// 이 호출은 55를 출력한다.
	cout << add_number (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1) << endl;
	return 0;
}