c로 배우는 자료구조 - 연습문제2

1. 연습문제2

image

이전 문제와의 차이 공백문자들이 문자의 앞, 중간, 뒤에 포함되어 있다.

문장의 앞과 뒤에 붙은 공백문자들은 제거하고 단어 사이에 두 개 이상의 연속된 공백문자들은 하나의 공백 문자로 대체하라는 연습문제

생각해보기 -> 압축하기 null character로 마지막이 끝난, 어떤 문자열을 받아서, 그것을 압축하는 ( 불필요한 공백들을 제거하는 ) 과정을 거친다.

2018-02-02 3 18 57

이런 작용을 하는 프로그램을 만들어보자 우선.

우선 두 개의 index 변수 i, j를 사용하겠다.

문자열에서 한 글자씩 봐서, 불필요한 공백은 무시하고, 공백이 아닌 문자들은 카피해와서 다른 배열로 옮겨온다. 마지막 널 캐릭터가 등장하면 끝.

변수 i는 압축할 문자열 str에서 현재 내가 보고 있는 문자. 변수 j는 압축된 배열에서, 새로운 문자열을 카피해올 자리를 말한다.

str에서 앞의 공백들은 넘어가면 된다. 규칙 - 첫 번째 공백은 복사, 나머지 공백은 건너 뛴다. 바로 앞 문자가 공백이 아니었다면, 복사를 하고 바로 직전에 복사한 문자가 공백이었다면, 공백이 연이어 나온다는 것이니까 건너 뛰면 된다. 즉 바로 직전 문자가 공백이냐 아니냐를 기준으로 공백 문자를 복사할 건가, 복사하지 않을 것인가를 알 수 있다.

또한 ‘\0\를 만나면 직전에 복사한 문자가 공백이면 한 칸 앞 당겨서 복사한다.

image

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

image

image

image


참고자료

동영상 주소

0%