문제 정의
런타임에 입력받은 문자열에서 while 루프를 사용해 각 인덱스의 문자가 공백인지 하나씩 검사하면서, 문장에 포함된 모든 공백을 제거하는 프로그램을 작성해 보겠습니다.
해결 방법
먼저 아래 예시를 살펴보겠습니다.
이 프로그램은 입력된 문자열에서 모든 공백을 제거합니다. 예를 들어 입력 문자열이 Tutorials Point C Programming이라면, 공백이 모두 제거된 결과는 TutorialsPointCProgramming이 됩니다.
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')를 만날 때까지 문자열 전체가 처리됩니다.
공백 제거 로직
문장 사이의 공백을 제거하기 위해 사용한 핵심 로직은 다음과 같습니다.
while(string[i]!='\0'){
check=0;
if(string[i]==' '){
j=i;
while(string[j-1]!='\0'){
string[j] = string[j+1];
j++;
}
check = 1;
}
if(check==0)
i++;
}
동작 원리를 정리하면 다음과 같습니다. 현재 위치의 문자가 공백이면, 그 뒤에 있는 모든 문자를 한 칸씩 앞으로 당겨와 공백 자리를 덮어쓰고, 공백이 아니라면 인덱스를 하나 증가시켜 다음 문자로 이동합니다. 이 과정을 문자열의 끝(널 문자)까지 반복하면 문장 전체에서 공백이 사라집니다.
예제 코드
다음은 문자열 개념을 활용해 문장에서 모든 공백을 제거하는 완전한 C 프로그램입니다.
#include<stdio.h>
int main() {
char string[50];
int i=0, j, check;
printf("Enter any statement: ");
gets(string);
while(string[i]!='\0') {
check=0;
if(string[i]==' ') {
j=i;
while(string[j-1]!='\0') {
string[j] = string[j+1];
j++;
}
check = 1;
}
if(check==0)
i++;
}
printf("\nSentence without spaces: %s", string);
getch();
return 0;
}
실행 결과
위 프로그램을 컴파일하고 실행하면 다음과 같은 출력을 확인할 수 있습니다.
Run 1: Enter any statement: Tutorials Point C Programming Sentence without spaces: TutorialsPointCProgramming Run 2: Enter any statement: Welcome to the world of tutorials Sentence without spaces: Welcometotheworldoftutorials
참고 사항
gets() 함수는 입력 크기를 제한할 수 없어 버퍼 오버플로우 위험이 있어 C11 표준에서 제거되었습니다. 실제 개발 환경에서는 fgets(string, sizeof(string), stdin)처럼 안전한 입력 함수를 사용하는 것이 좋습니다. 또한 getch()는 표준 C 함수가 아니라 conio.h를 제공하는 Windows 계열 컴파일러에서만 동작하므로, 리눅스 등 다른 환경에서는 제거하거나 대체 함수를 사용해야 합니다.