문자열을 입력받고(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)이므로 종료
지적 환영합니다. 댓글로 고견 부탁드립니다.
유익했다면 포스트 좌하단의 ♡공감 꾹 눌러주시면 글쓴이에게 힘이 됩니다!
'C Drill' 카테고리의 다른 글
C 재귀(Recursion) 예제 #4 - 문자열 홀수 번째 출력(Print odd-indexed characters) (0) | 2025.03.17 |
---|---|
C 재귀(Recursion) 예제 #2 - 피보나치 수열(Fibonacci numbers) (0) | 2025.03.16 |
C 재귀(Recursion) 예제 #1 - 팩토리얼(Factorial) (0) | 2025.03.16 |