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