본문 바로가기

CS/자료구조

[인프런|3강] C로 배우는 자료구조 | 문자열 연습문제

문자열 연습문제

 

 

위와 같은 결과를 만드는게 목표

 

#define BUFFER_SIZE 20

int main(void) {

  char buffer[BUFFER_SIZE];

 

  while(1) {

    printf("$ ");

    //scanf(buffer);  scanf는 공백 문자 기준으로 끊기 때문에 공백을 포함한 문장에 쓸 수 없음

    //gets(buffer);  gets는buffer에 담을 수 있는 길이 상관없이 담는 문제가 있다.

    //fgets(buffer, BUFFER_SIZE, stdin); BUFFER_SIZE만큼 읽는다. 단, \n, buffer size 초과시 원하는 대로 반영이 제대

로 안됨

   // buffer[strlen(buffer)-1] = '\0';  fgets를 쓸때 buffer[strlen(buffer)-1] 는 \n이라 개행 안되도록 \0로 변경

    k = read_line(buffer, BUFFER_SIZE);

    

    printf("%s:%d\n", buffer, k);

  }

 

}

 

다양한 입력함수가 있고 각자는 약간의 차이가 있다. 사용자가 알맞게 쓰고자하는 경우 변경하는 용도에 맞는 함수를 만들어 쓰기도 한다.

ex)

int read_line( char str[], int limit) {

  int ch, i =0;

  while((ch = getchar()) != '\n')

    if(i<limit)

      str[i++] = ch;

 

  str[i] = '\0';

  return i;

}

 

불필요한 공백을 제거하는 버젼

#define BUFFER_SIZE =80

int main() {

  char line[BUFFER_SIZE ];

  while(1) {

    printf("$ ");

    int length = read_line_with_compression(line, BUFFER_SIZE);

    printf("%s:%d\n", line, length);

  }

  return 0;

}

 

int read_line_with_compression( char compressed[], int limit ) {

  int ch, i =0;

  while((ch = getchar()) != '\n') {

    if( i < limit-1 && (!isspace(ch) || i > 0 && ! isspace(compressed[i-1]) ) ) {   //isspace를 쓰면 공백 및 탭 문자도 포함된다.

      compressed[i++] = ch;

    }

    if (i > 0 && ! isspace(compressed[i-1]))   // 마지막 문자가 공백일때를 감안한 조건문

      i--;

   compressed[i]  = '\0';

   return i;  

}