Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 문자열에서 모음 삭제하기: 핵심 로직과 예제 코드 총정리

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();
}

코드 동작 원리

  1. strlen() 함수로 문자열의 실제 길이를 구해 변수 len에 저장합니다.
  2. 바깥쪽 for문이 문자열의 각 문자를 차례대로 검사합니다.
  3. if 조건문에서 해당 문자가 소문자 또는 대문자 모음에 해당하는지 확인합니다.
  4. 모음이라면 안쪽 for문이 그 이후의 모든 문자를 한 칸씩 앞으로 복사해 모음을 덮어씁니다.
  5. 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() 등의 표준 함수로 대체하는 것이 좋습니다.