반응형
문자열을 입력받고(fgets 이용), 재귀함수를 이용하여 홀수 번째의 문자열만 출력하라.
예시:
#include <stdio.h>
#include <string.h>
#define STR_SIZE 20 //저장할 수 있는 문자의 개수: 18(널문자 + 개행)
void oddstr(char[], int);
int main()
{
char input[STR_SIZE] = { 0, };
printf("문자열을 입력해주세요: ");
fgets(input, STR_SIZE, stdin);
//개행문자 제거 준비
input[strlen(input) - 1] = '\0'; //개행문자를 NULL문자로
printf("\n홀수번째만 출력: ");
oddstr(input, 0);
printf("\n");
return 0;
}
void oddstr(char str[], int num)
{
if (str[num] == '\0') {
return; //Base case: 0부터 문자열 끝에 도착하면
}
if (num % 2 == 0) { //Recursive case
printf("%c", str[num]);
}
oddstr(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'이 0에서 1씩 증가할 때마다 재귀 호출하고 'num % 2 == 0'이면 해당 문자를 출력한다. 언제까지? '\0'에 도달할 때까지( == 문자열이 끝날 때까지). 재귀 함수가 호출될 때마다 새로운 함수 호출이 Stack frame으로 쌓이게 된다. 재귀 호출이 끝나면 해당 Stack frame이 제거된다.
oddstr("Hello", 0) → H 출력, oddstr("Hello", 1) 호출
oddstr("Hello", 1) → 출력 없음, oddstr("Hello", 2) 호출
oddstr("Hello", 2) → l 출력, oddstr("Hello", 3) 호출
oddstr("Hello", 3) → 출력 없음, oddstr("Hello", 4) 호출
oddstr("Hello", 4) → o 출력, oddstr("Hello", 5) 호출
oddstr("Hello", 5) → '\0'이므로 종료
각 호출은 Stack frame에서 관리한다.
지적 환영합니다. 댓글로 고견 부탁드립니다.
유익했다면 포스트 좌하단의 ♡공감 꾹 눌러주시면 글쓴이에게 힘이 됩니다!
반응형
'C Drill' 카테고리의 다른 글
C 재귀(Recursion) 예제 #3 - 문자열 뒤집기(Reversing string) (0) | 2025.03.16 |
---|---|
C 재귀(Recursion) 예제 #2 - 피보나치 수열(Fibonacci numbers) (0) | 2025.03.16 |
C 재귀(Recursion) 예제 #1 - 팩토리얼(Factorial) (0) | 2025.03.16 |