Maximize Your Potential

BackEnd/C

[42경산 라피신 과제 뽀개기] C01 과제 기본기 잡는 출력 함수 완전 정리

maxworld 2025. 7. 14. 23:13
728x90

 [42경산 라피신 과제 뽀개기] C01 과제 기본기 잡는 출력 함수 완전 정리

[42경산 라피신 과제 뽀개기] C01 과제 기본기 잡는 출력 함수 완전 정리

 

42서울/42경산에서 C01 과제를 시작하면 누구나 만나는 대표 포인터 함수들!
단순해 보여도 포인터의 개념과 메모리 흐름을 한 번에 익히기 딱 좋습니다.
이번 글에서는 꼭 알아야 할 함수들을 예제 소스와 함께 흐름까지 줄글로 풀어봅니다.


✅ 1️⃣ ft_ft

#include <unistd.h> 
void ft_ft(int *nbr) 
{ 
	*nbr = 42; 
 }
 

ft_ft 함수는 가장 기본적인 포인터 대입 연습입니다.
매개변수로 정수형 포인터를 하나 받는데, 이 포인터는 어떤 변수의 주소를 가리키게 됩니다.
함수 내부에서 *nbr = 42;를 하면 포인터가 가리키는 주소에 들어있는 값이 42로 바뀝니다.

즉, 함수가 끝나더라도 원본 변수의 값이 바뀌는 것이죠.
이런 기본 원리를 이해해야 포인터가 왜 필요한지, 함수가 값을 리턴하지 않고도 여러 데이터를 바꿀 수 있는지 이해할 수 있습니다.

포인터가 처음이라면 *가 포인터 선언인지 역참조(값 대입)인지 헷갈릴 수 있으니 구분해서 연습하세요!


✅ 2️⃣ ft_ultimate_ft

#include <unistd.h> 
void ft_ultimate_ft(int *********nbr) 
{ 
	*********nbr = 42; 
}
 

ft_ultimate_ft는 말 그대로 궁극의 포인터 실습입니다.
한 번만 포인터로 받는 것이 아니라 int *********nbr로 9중 포인터로 받아서 최종적으로 안쪽의 int 값을 42로 바꿉니다.

실무에서는 이렇게 깊게 포인터를 중첩할 일은 거의 없지만,
포인터의 구조가 어떻게 연결되어 있는지 화살표로 직접 종이에 그려보면 정말 큰 도움이 됩니다.

예를 들어,

  • int a = 0;
  • int *p1 = &a;
  • int **p2 = &p1;
  • ...
  • int *********p9 = &p8;

이런 식으로 연결되어 있는 구조가 *********p9라는 표현 하나로 가장 안쪽의 int에 도달해 값을 바꾸는 겁니다.


✅ 3️⃣ ft_swap

 
#include <unistd.h>

void	ft_swap(int *a, int *b)
{
	int	temp;

	temp = *a;
	*a = *b;
	*b = temp;
}

ft_swap은 두 변수의 값을 서로 바꾸는 전형적인 스왑(Swap) 함수입니다.
여기서 중요한 포인트는 값을 바꿔야 하기 때문에 단순히 int a, int b가 아니라 int *a, int *b로 포인터를 받아야 한다는 점입니다.

  • temp 임시 변수에 하나의 값을 저장해두지 않으면 한 쪽 값이 덮어쓰여서 사라집니다.
  • 포인터로 받았기 때문에 함수 안에서 바꾼 값이 호출한 쪽에서도 반영됩니다.

자료구조에서 정렬 알고리즘을 구현할 때 스왑 로직은 정말 자주 쓰이니 완벽히 이해하고 넘어가세요!


✅ 4️⃣ ft_div_mod

#include <unistd.h>

void	ft_div_mod(int a, int b, int *div, int *mod)
{
	*div = a / b;
	*mod = a % b;
}
 
 
 

ft_div_mod는 두 수를 나누어서 몫과 나머지를 동시에 구하는 함수입니다.
C언어는 기본적으로 함수가 하나의 값만 return 할 수 있기 때문에, 이렇게 여러 개의 값을 반환하고 싶을 때는 포인터로 전달받아 값을 직접 바꿔주면 됩니다.

  • *div = a / b;로 몫을 저장하고
  • *mod = a % b;로 나머지를 저장합니다.

이렇게 하면 호출한 쪽에서는 div와 mod에 각각 몫과 나머지가 저장되어 있습니다.


✅ 5️⃣ ft_ultimate_div_mod

#include <unistd.h>

void	ft_ultimate_div_mod(int *a, int *b)
{
	int	temp;

	temp = *a;
	*a = temp / *b;
	*b = temp % *b;
}
 
 

ft_ultimate_div_mod는 ft_div_mod와 비슷하지만 좀 더 직접적입니다.
아예 *a와 *b 자체에 몫과 나머지를 덮어씌워버립니다.

  • 임시로 temp에 *a를 저장해두고
  • 나누기 연산과 나머지 연산을 차례대로 수행합니다.

순서를 잘못하면 원본 데이터가 바뀌어 연산이 꼬이기 때문에 temp를 꼭 쓰는 것이 핵심입니다.


✅ 6️⃣ ft_putstr

#include <unistd.h>

void	ft_putstr(char *str)
{
	int	i;

	i = 0;
	while (str[i])
	{
		write(1, &str[i], 1);
		i++;
	}
}
 
 

ft_putstr는 문자열을 출력하는 함수입니다.
기본적으로 C에서 문자열은 char *로 시작하며, '\0' (널 문자)까지 이어집니다.

while (str[i])는 널 문자를 만나면 반복을 멈추는 기본 패턴입니다.
write(1, &str[i], 1)는 1은 표준 출력(stdout)을 의미하며, 한 글자씩 출력됩니다.


✅ 7️⃣ ft_strlen

#include <unistd.h>

int	ft_strlen(char *str)
{
	int	length;

	length = 0;
	while (str[length])
	{
		length++;
	}
	return (length);
}
 
 

ft_strlen은 문자열의 길이를 계산하는 함수입니다.
C 언어에서는 문자열 끝이 '\0'으로 표시되기 때문에 이를 만날 때까지 length를 카운트하면 됩니다.

이 함수는 표준 라이브러리의 strlen 함수와 동일한 역할을 하므로 직접 만들어보면 라이브러리 함수의 내부 동작을 이해하는 데 큰 도움이 됩니다.


✅ 8️⃣ ft_rev_int_tab

void	ft_rev_int_tab(int *tab, int size)
{
	int	i;
	int	tmp;

	i = 0;
	while (i < (size / 2))
	{
		tmp = tab[i];
		tab[i] = tab[size - 1 - i];
		tab[size - 1 - i] = tmp;
		i++;
	}
}
 

ft_rev_int_tab은 정수 배열을 뒤집는 함수입니다.
배열의 양쪽 끝을 서로 바꿔가면서 진행하며, 반복문은 배열 길이의 절반까지만 수행합니다.

  • tmp 임시 변수를 사용해 값을 덮어쓰지 않도록 주의해야 합니다.
  • size - 1 - i를 쓰는 패턴은 배열 뒤쪽 인덱스를 계산할 때 자주 등장합니다.

배열 처리와 인덱스 연산 감각을 키우기에 딱 좋은 연습 예제입니다.


🏷️ 마무리 & 해시태그

이렇게 C01 과제는 단순한 것 같아도 포인터와 메모리 구조를 자연스럽게 익힐 수 있게 되어있습니다.
직접 printf로 변수 값을 출력해가며 확인하면 이해도가 훨씬 올라갑니다!