본문 바로가기
프로그래밍언어/C 언어

[혼자 공부하는 C언어] 연산 함수 직접 구현

by khsnote22 2022. 12. 10.

http://www.yes24.com/Product/Goods/74269921

 

혼자 공부하는 C 언어 - YES24

혼자 해도 충분하다! 1:1 과외하듯 배우는 C 프로그래밍 자습서이 책은 독학으로 C 언어를 배우는 입문자가 ‘꼭 필요한 내용을 제대로’ 학습할 수 있도록 구성했다. ‘무엇을’ ‘어떻게’ 학

www.yes24.com


앞서 제일 먼저 다뤘던 strcpy 함수를 직접 만들어 보겠습니다. strcpy 함수는 포인터를 써서 문자열을 복사합니다. strcpy 함수는 문자열이 저장된 메모리에서 첫 번째 문자의 주소를 인수로 받습니다. 이 주소로 어떻게 문자열 전부를 복사하는지 지금부터 살펴보겠습니다. 

// strcpy와 기능이 같은 함수의 구현

#include <stdio.h>

char* my_strcpy(char* pd, char* ps); // 함수 선언

int main(void)
{
	char str[80] = "strawberry";

	printf("바꾸기 전 문자열 : %s\n", str);
	my_strcpy(str, "apple");  // 문자열 "apple" 복사
	printf("바꾼 후 문자열 : %s\n", str);
	printf("다른 문자열 대입 : %s\n", my_strcpy(str, "kiwi")); // 반환값으로 출력

	return 0;
}

char* my_strcpy(char* pd, char* ps) // 복사 받을 곳과 복사할 곳의 포인터
{
	char* po = pd; // pd 값을 나중에 반환하기 위해 보관
	
	while (*ps != '\0') // ps가 가리키는 문자가 널 문자가 아닌 동안
	{
		*pd = *ps; // ps가 가리키는 문자를 pd가 가리키는 위치에 대입
		pd++; // 복사 받을 다음 위치로 포인터 증가
		ps++; // 복사할 다음 문자의 위치로 포인터 증가 
	}
	*pd = '\0'; // 복사가 모두 끝난 후 복사 받을 곳에 널 문자로 마무리
	
	return po; // 복사가 끝난 저장 공간의 시작 주소 반환
}

strcat 함수와 같은 기능을 수행하는 함수를 만들면 다음과 같습니다.

char* my_strcat(char* pd, char* ps)
{
	char* po = pd; // 배열의 처음 위치 보관 
	
	while (*pd != '\n') // pd를 널 문자 위치로 이동
	{
		pd++;
	}
	while (*ps != '\0') // 여기서 부터는 문자열 복사와 같음
	{
		*pd = *ps;
		pd++;
		ps++;
	}
	*pd = '\0';
	return po; // 붙여넣은 배열의 시작 위치 반환
}

strlen 함수와 같은 기능을 수행하는 함수를 만들면 다음과 같습니다.

int my_strlen(char* ps) // ps 는 배열명을 저장하고 첫 번째 배열 요소를 가리킴
{
	int cnt = 0; // 문자수를 세기 위한 변수
	while (*ps != '\0') // ps가 가리키는 문자가 널 문자가 아닌 동안
	{
		cnt++; // 문자 수 증가
		ps++; // 포인터를 다음 문자의 위치로 이동
	}
	return cnt;
}

strcmp 함수와 똑같이 작동하는 함수를 만들면 다음과 같습니다.

int my_strcmp(char* pa, char* pb)
{
	while ((*pa == *pb) && (*pb != '\0')) // 두 문자가 같으나 널 문자가 아닌 경우
	{
		pa++; // 다음 문자로 이동
		pb++; // 다음 문자로 이동
	}
	// 반복문 이후 이 시점에서는 두 문자가 다르거나 둘 다 널 문자임
	if (*pa > *pb) return 1; // 앞 문자의 아스키 코드 값이 크면 1 반환
	else if (*pa < *pb) return -1; // 뒷 문자의 아스키 코드 값이 크면 -1 반환
	else return 0; // 둘 다 널 문자이므로 같은 문자열
}