[C/gLib] trim과 문자열을 찾는 함수 작성하기

2019. 4. 26. 11:00Programming/C, C++

반응형

문자열을 특정 토큰단위로 끊거나 할 때는, 공백이 있을 경우를 대비해서 trim이 필요하다. 물론 gLib을 사용한다면 토큰 단위로 끊은 다음에, g_strstrip을 이용해서 앞/뒤의 공백만 잘라주는 편이 더 효율적인 경우가 많다. 처음에는 공백만 제거하는 함수를 만들었다가, 이후에는 특정 문자열을 제거하는 함수로 수정했다. 작성한 함수는 아래와 같다.

  gchar*
trim(char* target_string, char symbol) {
  if(target_string == NULL) {return -1;}

  gchar before_string[256];
  gchar after_string[256];
  gint index_before=0;
  gint index_after=0;
  gint len_target_string=0;

  memset(before_string, 0x00, sizeof(before_string));
  memset(after_string, 0x00, sizeof(after_string));

  snprintf(before_string, sizeof(before_string), "%s", target_string);
  snprintf(after_string, sizeof(after_string), "");
  len_target_string = strnlen(before_string, sizeof(before_string));

  for(index_before=0, index_after=0; index_before<len_target_string; index_before++) {
    if(before_string[index_before] == symbol) {
      continue;
    } else {
      after_string[index_after++] = before_string[index_before];
    }
  }

  return after_string;
}

코드 자체는 단순하다. 문자 배열을 만든 후 앞에서부터 복사하다가, symbol을 발견하면 건너뛴다.
다음은 문자열을 찾는 indexOf. 처음에는 strcmp, strncmp를 indexOf, 찾아야 할 문자열에 bikemotorbike같은 단어들이 함께 들어있는 경우가 문제가 됐다. 그래서 분기조건을 strcmp의 결과값이 0 이상으로 잡으면, 종종 잘못된 결과가 발생했다.

  gint
indexOf(char* target_string, char token, char* keyword) {
  if(target_string == NULL) {return -1;}

  gint result=-1;
  gchar orig_string[256];
  gchar **splited_string=NULL;
  gint len_splited_string=0;
  gint index_splited_string=0;

  memset(orig_string, 0x00, sizeof(orig_string));

  snprintf(orig_string, sizeof(orig_string), "%s", target_string);

  // if(token != ' ') {
  //   snprintf(orig_string, sizeof(orig_string), "%s", trim(orig_string, ' '));
  // }

  splited_string = g_strsplit(target_string, ",", MAX_TOKEN_COUNT);
  len_splited_string = g_strv_length(splited_string);

  for(index_splited_string=0; index_splited_string<len_splited_string; index_splited_string++) {
    if(strcmp(splited_string[index_splited_string], keyword) == 0) {
      result = index_splited_string;
      break;
    }
  }

  g_strfreev(splited_string);

  return result;
}

g_strsplit을 이용해서 문자열을 token단위로 잘라낸 후, 문자열 조각들 중에 keyword와 일치하는 문자열이 있으면 몇 번째 위치에 존재하는지 반환하는 함수이다. 중간에 위에 만든 trim을 이용해서 공백을 제거한 뒤 찾으려고 했으나, 공백이 있는 키워드를 사용할 가능성이 있어서 예외로 처리했다.

반응형