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

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

C 자세히보기

C Drill

C 재귀(Recursion) 예제 #4 - 문자열 홀수 번째 출력(Print odd-indexed characters)

새미 소사 2025. 3. 17. 00:49
반응형
문자열을 입력받고(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에서 관리한다.

 

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

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

반응형