나 사랑하는 것과 영원히 함께 흘러가

나 잃어버린 것보다 이뤄갈 날을 위해 흘러가

C 자세히보기

C Drill

C 재귀(Recursion) 예제 #3 - 문자열 뒤집기(Reversing string)

새미 소사 2025. 3. 16. 23:24
반응형
문자열을 입력받고(fgets 이용), 재귀함수를 이용하여 문자열을 반대로 뒤집어 출력하라.

 

 

 

예시:

#include <stdio.h>
#include <string.h>

#define STR_SIZE 20 //저장할 수 있는 문자의 개수: 18(널문자 + 개행)

void reverse(char[], int);

int main()
{
	char input[STR_SIZE] = { 0, };
	printf("문자열을 입력해주세요: ");
	fgets(input, STR_SIZE, stdin);
	//개행문자 제거 준비
	input[strlen(input) - 1] = '\0'; //개행문자를 NULL문자로
	printf("반대로 출력: ");
	reverse(input, strlen(input) - 1); //문자열 뒤집을 준비
	printf("\n");
	return 0;
}	

void reverse(char str[], int num)
{
	if (num < 0) {
		return; //Base case: num - 1을 계속 수행해서 0보다 작을때
	}
	printf("%c", str[num]);
	reverse(str, num - 1);
}

Hello를 입력한다고 생각해 보자.

Point 1: fgets로 입력받은 string은 메모리에 'H' 'e' 'l' 'l' 'o' '\n' '\0' 이런 식으로 저장되므로 input[strlen(input) - 1] = '\0';을 사용해서 마지막 '\n'을 '\0'으로 치환하여 문장의 마지막이 '\n'이 아닌 '\0'임을 알려주자.

Point 2: 탈출 조건(Base case) 설정: num이 1씩 감소할 때마다 재귀 호출한다. 언제까지? num이 0보다 작아질때까지.

Point 3: 재귀 호출을 통해 스택 프레임이 쌓이는 원리 이해. reverse(input, strlen(input) - 1); → 이 함수는 NULL 문자를 제외하고 마지막 문자 'o'부터 시작하여 재귀적으로 문자를 하나씩 출력한 다음 재귀 호출을 진행한다.  

즉, 함수 호출 과정은

reverse("Hello", 4) → o 출력, reverse("Hello", 3) 호출

reverse("Hello", 3) → l 출력, reverse("Hello", 2) 호출

reverse("Hello", 2) → l 출력, reverse("Hello", 1) 호출

reverse("Hello", 1) → e 출력, reverse("Hello", 0) 호출

reverse("Hello", 0) → h 출력, reverse("Hello", -1) 호출

reverse("Hello", -1) → Base case (num < 0)이므로 종료

 

지적 환영합니다. 댓글로 고견 부탁드립니다.

유익했다면 포스트 좌하단의 ♡공감 꾹 눌러주시면 글쓴이에게 힘이 됩니다!

반응형