[C/gLib] trim과 문자열을 찾는 함수 작성하기
2019. 4. 26. 11:00ㆍProgramming/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, 찾아야 할 문자열에 bike
와 motorbike
같은 단어들이 함께 들어있는 경우가 문제가 됐다. 그래서 분기조건을 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
을 이용해서 공백을 제거한 뒤 찾으려고 했으나, 공백이 있는 키워드를 사용할 가능성이 있어서 예외로 처리했다.
반응형
'Programming > C, C++' 카테고리의 다른 글
Onvif 라이브러리 크로스 컴파일 방법 정리 (0) | 2022.01.05 |
---|---|
libcrypt.so와 glibc의 크로스 컴파일에 대하여 (0) | 2020.05.18 |
GLib을 이용해서 문자열 나누기(g_strsplit) (2) | 2019.04.17 |
[C/C++] 문자열 타입의 MAC ADDRESS 포멧 확인 (sscanf) (0) | 2019.03.19 |
[C/C++] 정수를 IP주소로 변환하기 (Decimal to IP Address) (0) | 2019.03.18 |