GLib을 이용해서 문자열 나누기(g_strsplit)

2019. 4. 17. 20:43Programming/C, C++

반응형

C에서 문자열을 조작하는 것은 생각보다 짜증나는 일이다. GLib을 사용하면 문자열 조작을 수월하게 할 수 있는데, 문서만 잘 읽어보면 어렵지 않게 활용할 수 있다. 일단 GLib이 포함되어있고, 문자열을 조작할 일이 생겼다면 이 글을 읽기보다 String Utility Functions: GLib Reference을 보도록 하자. 훨씬 도움될 것이다.

문자열을 자르거나 붙이는 등, 대부분의 것들은 문서에 포함되어있다. Reference에 없는 함수로 부족한 경우에는, strlib.h의 내용으로 구현 가능한 경우가 대부분이다. 내 경우에는 이 Reference 중 g_strsplit을 자주 사용하며, 이 글을 작성하는 이유도 사실 g_strsplit에 대한 내용을 정리하기 위함이다.

 

특정 토큰을 이용해서 문자열을 나누려면 g_strsplit 함수를 사용하면 된다. 이 함수는 string, delimiter, max_tokens를 파라메터로 전달받으며, 문자열 배열만큼 메모리를 할당하여 반환하게 된다. 따라서 g_strsplit을 사용하고 난 뒤에는, g_strfreev를 이용하여 메모리 할당을 해제해줘야 한다. 간단한 예제는 다음과 같다.

gchar **splited_text = NULL;
gint count_splited_text = 0;
gint index_loop = 0;

splited_text = g_strsplit("bike,bus,car", ",", -1); //max_tokens값을 -1로 주면 최대치에 제한을 두지 않는다.
count_splited_text = g_strv_length(splited_text); //g_strv_length는 g_strsplit 안의 문자열 갯수를 반환한다.

for(index_loop=0; index_loop<count_splited_text; index_loop) {
  g_message("%s", splited_text[index_loop]); //이 루프문은 "bike", "bus", "car"를 출력한다.
}

g_strfreev(splited_text); //g_strsplit으로 할당된 메모리를 해제해준다.

 

이 때 g_strsplit이 실패했을 경우에는 NULL을 반환하게 되는데, NULL체크를 하지 않고 사용하는 경우 NULL포인터 참조로 인해 프로그램이 종료될 수 있다. 따라서 사용하기 전에 반드시 NULL체크를 해줘야 한다.

Reference를 보다보면 파라메터에 strstrv가 있는데, str로 표기된 것은 String을 나타내며 strv로 표기된 것은 String Array를 나타낸다. 이 점만 유념해서 본다면, 문자열을 덜 스트레스 받으면서 구현할 수 있다. :)

 

반응형