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

C 언어로 문자열의 여분 공백 제거하기 – 문자열 개념을 활용한 프로그램


문제 정의

프로그램 실행 중에 사용자로부터 입력받은 문장에서, 각 인덱스의 문자를 하나씩 검사하는 방식으로 문자열 사이의 여분 공백(연속된 중복 공백, 문자열 맨 앞의 공백)을 모두 제거하는 것이 이번 예제의 목표입니다.

해결 방법

예를 들어 Tutorials  Point   C  Programming처럼 공백이 여러 개 섞여 있는 문자열이 있다고 가정해 보겠습니다. 프로그램을 실행하면 중복된 공백이 제거되어 Tutorials Point C Programming처럼 단어 사이에 공백이 하나씩만 남도록 정리됩니다.

C 언어에서 문자(character)들의 배열을 문자열(string)이라고 부릅니다.

문자열 선언

문자열은 다음과 같은 형식으로 선언합니다.

char stringname [size];

예를 들어 char string[50];은 최대 50자를 저장할 수 있는 문자열을 의미합니다.

초기화

  • 단일 문자 상수를 이용하는 방법
char string[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
  • 문자열 상수를 이용하는 방법
char string[10] = "Hello";

접근

문자열을 다룰 때는 제어 문자열 %s를 사용하며, 이때 널 종료 문자인 '\0'을 만날 때까지 문자가 처리됩니다.

문자열 사이의 여분 공백을 제거하기 위해 사용한 핵심 로직은 다음과 같습니다.

len = strlen(string);
for(i=0; i<len; i++){
    if(string[0]==' '){
        for(i=0; i<(len-1); i++)
        string[i] = string[i+1];
        string[i] = '\0';
        len--;
        i = -1;
        continue;
    }
    if(string[i]==' ' && string[i+1]==' '){
        for(j=i; j<(len-1); j++){
            string[j] = string[j+1];
        }
        string[j] = '\0';
        len--;
        i--;
    }
}

로직을 간단히 정리하면 다음과 같습니다.

  • 맨 앞 공백 제거: 문자열의 첫 문자가 공백이면 나머지 문자를 한 칸씩 앞으로 당기고, 문자열 길이(len)를 1 줄인 뒤 인덱스를 처음부터 다시 검사합니다.
  • 중복 공백 제거: 현재 문자와 바로 다음 문자가 모두 공백이면 뒤쪽 문자들을 한 칸씩 앞으로 당겨 공백 하나를 삭제하고, 길이를 1 줄인 후 같은 위치부터 다시 검사합니다.

예제 코드

다음은 문자열 개념을 활용해 문장에서 여분의 공백을 제거하는 C 프로그램입니다.

#include<stdio.h>
int main() {
    char string[200];
    int i, j, len;
    printf("Enter a statement: ");
    gets(string);
    len = strlen(string);
    for(i=0; i<len; i++) {
        if(string[0]==' ') {
            for(i=0; i<(len-1); i++)
            string[i] = string[i+1];
            string[i] = '\0';
            len--;
            i = -1;
            continue;
        }
        if(string[i]==' ' && string[i+1]==' ') {
            for(j=i; j<(len-1); j++) {
                string[j] = string[j+1];
            }
            string[j] = '\0';
            len--;
            i--;
        }
    }
    printf("\nNew String after removing extra spaces is = %s", string);
    getch();
    return 0;
}

참고: gets() 함수는 입력 길이를 제한할 수 없어 버퍼 오버플로 위험이 있으며 C11 표준에서 제외되었습니다. 실제 프로젝트에서는 fgets() 사용을 권장합니다.

출력 결과

위 프로그램을 실행하면 다음과 같은 결과를 확인할 수 있습니다.

Enter a statement: Welcome  to   The world of C programming
New String after removing extra spaces is = Welcome to The world of C programming