1. 연습문제2
이전 문제와의 차이 공백문자들이 문자의 앞, 중간, 뒤에 포함되어 있다.
문장의 앞과 뒤에 붙은 공백문자들은 제거하고 단어 사이에 두 개 이상의 연속된 공백문자들은 하나의 공백 문자로 대체하라는 연습문제
생각해보기 -> 압축하기 null character로 마지막이 끝난, 어떤 문자열을 받아서, 그것을 압축하는 ( 불필요한 공백들을 제거하는 ) 과정을 거친다.
이런 작용을 하는 프로그램을 만들어보자 우선.
우선 두 개의 index 변수 i, j를 사용하겠다.
문자열에서 한 글자씩 봐서, 불필요한 공백은 무시하고, 공백이 아닌 문자들은 카피해와서 다른 배열로 옮겨온다. 마지막 널 캐릭터가 등장하면 끝.
변수 i는 압축할 문자열 str에서 현재 내가 보고 있는 문자. 변수 j는 압축된 배열에서, 새로운 문자열을 카피해올 자리를 말한다.
str에서 앞의 공백들은 넘어가면 된다. 규칙 - 첫 번째 공백은 복사, 나머지 공백은 건너 뛴다. 바로 앞 문자가 공백이 아니었다면, 복사를 하고 바로 직전에 복사한 문자가 공백이었다면, 공백이 연이어 나온다는 것이니까 건너 뛰면 된다. 즉 바로 직전 문자가 공백이냐 아니냐를 기준으로 공백 문자를 복사할 건가, 복사하지 않을 것인가를 알 수 있다.
또한 ‘\0\를 만나면 직전에 복사한 문자가 공백이면 한 칸 앞 당겨서 복사한다.
#include <stdio.h>
#include <string.h>
void compress_line(char str[]);
int main()
{
char str[] = " IS it fun ! ";
compress_line(str);
printf("%s:%d\n", str, strlen(str));
}
void compress_line(char str[])
{
int i = 0, j = 0;
char compressed[100];
char prev = '\0';
while(str[i]==' ') // skip the leading blanks
i++;
while(str[i] != '\0\')
if (str[i] != ' ' || prev != ' '){
compressed[j] = str[i];
j++;
}
prev = str[i];
i++;
}
if (prev == ' ')
j--;
compressed[j] = '\0';
strcpy(str, compressed);
}
참고자료