C 프로그래밍에서 입력된 문자열로부터 모음(a, e, i, o, u 및 대문자 형태)을 제거하는 것은 문자열 처리 능력을 기르는 대표적인 연습 문제입니다. 이 글에서는 중첩 반복문과 조건문을 활용한 핵심 로직을 단계별로 설명하고, 전체 예제 코드와 실행 결과까지 함께 확인해 보겠습니다.
모음 삭제 핵심 로직
주어진 문자열에서 모음을 삭제하는 데 사용되는 기본 로직은 다음과 같습니다.
- 문자열 전체를 처음부터 끝까지 순회하며 각 문자가 모음인지 검사합니다.
- 모음을 발견하면 해당 위치부터 문자열 끝까지의 모든 문자를 한 칸씩 앞으로 당겨 빈 공간을 메웁니다.
- 한 문자가 삭제될 때마다 문자열 길이(len)를 1씩 줄여 배열 범위를 벗어나지 않도록 합니다.
for(i=0; i<len; i++) // i가 len보다 작은 동안 반복
{
if(str[i]=='a' || str[i]=='e' || str[i]=='i' || // 모음 여부 검사
str[i]=='o' || str[i]=='u' || str[i]=='A' ||
str[i]=='E' || str[i]=='I' || str[i]=='O' ||
str[i]=='U')
{
for(j=i; j<len; j++)
{
str[j]=str[j+1]; // 뒤쪽 문자를 한 칸씩 앞으로 이동
}
len--; // 문자열 길이 1 감소
}
}
전체 예제 코드
다음은 사용자로부터 문자열을 입력받아 모음을 삭제한 후 결과를 출력하는 C 프로그램의 전체 소스 코드입니다.
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
char str[20];
int len, i, j;
clrscr();
printf("Please Enter any String: ");
gets(str);
len = strlen(str);
for(i=0; i<len; i++)
{
if(str[i]=='a' || str[i]=='e' || str[i]=='i' || str[i]=='o' || str[i]=='u' ||
str[i]=='A' || str[i]=='E' || str[i]=='I' || str[i]=='O' || str[i]=='U')
{
for(j=i; j<len; j++)
{
str[j] = str[j+1];
}
len--;
}
}
printf("After Deleting the vowels, the String is: %s", str);
getch();
}
코드 동작 원리
- strlen() 함수로 문자열의 실제 길이를 구해 변수 len에 저장합니다.
- 바깥쪽 for문이 문자열의 각 문자를 차례대로 검사합니다.
- if 조건문에서 해당 문자가 소문자 또는 대문자 모음에 해당하는지 확인합니다.
- 모음이라면 안쪽 for문이 그 이후의 모든 문자를 한 칸씩 앞으로 복사해 모음을 덮어씁니다.
- len 값을 1 줄여 유효한 문자열 길이를 갱신하며, 같은 인덱스를 다시 검사해 연속된 모음도 모두 처리합니다.
실행 결과
위 프로그램을 컴파일하여 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Please Enter any String: TutorialsPoint After Deleting the vowels, the String is: TtralsPint
"TutorialsPoint"라는 입력 문자열에서 모음(u, o, i, a, o, i)이 모두 제거되어 최종적으로 "TtralsPint"가 출력되는 것을 확인할 수 있습니다.
참고 사항
예제에 사용된 gets() 함수는 버퍼 오버플로우 위험 때문에 C11 표준에서 제거되었으므로, 실제 개발 환경에서는 입력 크기를 제한할 수 있는 fgets() 사용을 권장합니다. 또한 clrscr(), getch(), conio.h는 Turbo C 계열에서만 지원되는 비표준 요소이므로, GCC나 Clang 같은 최신 컴파일러 환경에서는 getchar() 등의 표준 함수로 대체하는 것이 좋습니다.