GString是GLib所提供的對字串處理的型態,GString保有字串的長度資訊,當您對GString進行插入、附加時,GString會自動調整長度,您也可以搭配一些GLib的函式來方便的處理字串。
GString的定義如下:
gchar *str;
gsize len;
gsize allocated_len;
} GString;
str為null結尾的C字串之參考,len為目前字串不包括null結尾的長度,allocated_len為GString所配置的緩衝區長度,如果字串長度超出這個長度會自動重新配置。
您有三種方式可以建立GString:
GString* g_string_new_len(const gchar *init, gssize len);
GString* g_string_sized_new(gsize dfl_size);
第一個函式依所給的init字串來建立適當len的GString,並保留適當的allocated_len,建立的時候是將init字元複製至 GString中。第二個函式則是指定len來建立GString,因為是自行指定,所以len必須超過init的長度。第三個函式則是指定 allocated_len來建立GString。
您可以從下面的範例程式看出三個函式的作用:
- gstring_demo.c
#include <glib.h>
int main(int argc, char *argv[]) {
GString *string = g_string_new("Justin");
g_print("len = %d, allocated_len = %d/n",
string->len, string->allocated_len);
g_string_free(string, FALSE);
string = g_string_new_len("Justin", 32);
g_print("len = %d, allocated_len = %d/n",
string->len, string->allocated_len);
g_string_free(string, FALSE);
string = g_string_sized_new(32);
g_print("len = %d, allocated_len = %d/n",
string->len, string->allocated_len);
g_string_free(string, FALSE);
return 0;
}
若不使用GString時,可以使用g_string_free()釋放,其第二個參數若為TRUE,則會連同C的字串一同釋放。
執行的結果如下所示:
len = 6, allocated_len = 16 len = 32, allocated_len = 64 len = 0, allocated_len = 64 |
字串的串接可以使用g_string_append()等函式,例如:
g_string_append(string, "GTK 程式設計!");
g_print("%s/n", string->str);
這一段程式碼會在主控台上顯示 "哈囉!GTK 程式設計!"(以UTF8撰寫程式的話可以顯示中文),若想要在前端附加則使用g_string_prepend()等函式,若想要中間插入字元則使用g_string_insert()等函式。
除了單純的附加、插入字元等函式之外,以下還有幾個常用的操作字串的函式:
g_string_equal() | 判斷兩個GString的字元內容是否相同 |
g_string_ascii_up()或g_utf8_strup() | 轉換GString中的字元為小寫 |
g_string_ascii_down()或g_utf8_strdown() | 轉換GString中的字元為大寫 |
g_string_printf() | 如printf()一樣的方式,在GString中格式化字串 |
一個簡單的範例如下所示:
- gstring_demo.c
#include <glib.h>
int main(int argc, char *argv[]) {
GString *string1, *string2;
gboolean is_eq;
string1 = g_string_sized_new(16);
g_string_printf(string1, "This is %s speaking!", "caterpillar");
g_print("%s/n", string1->str);
string2 = g_string_new("This is caterpillar speaking!");
is_eq = g_string_equal(string1, string2);
g_printf("equal: %s/n", is_eq ? "TRUE" : "FALSE");
g_string_ascii_up(string1);
g_printf("Upper: %s/n", string1->str);
g_string_ascii_down(string1);
g_printf("Down: %s/n", string1->str);
g_string_free(string1, FALSE);
g_string_free(string2, FALSE);
return 0;
}
執行結果如下所示:
This is caterpillar speaking! equal: TRUE Upper: THIS IS CATERPILLAR SPEAKING! Down: this is caterpillar speaking! |
除了以上所介紹的,您還可以參考 GString 說明文件 ,另外 GLib 對於字串還提供了 String Utility Functions ,包括更多的字串處理函式。