學過面向對象語言的同學一定都知道String類,一定知道這個類對字符串的操作是多麼的方便,但是c語言中是沒有這個類,甚至沒有類的概念,但是glib幫我們做的這個“類” ?GString
除了使用gchar *進行字符串處理以外,Glib還定義了一種新的數據類型: GString。
它類似于標準C的字符串類型,但是GString能夠自動增長。它的字符串數據是以NULL結尾的。
這些特性可以防止程序中的緩沖溢出。這是一種非常重要的特性。
GString是一種動態字符串數據結構,提供了豐富靈活方便的API,無需手工分配內存,無需擔心緩沖區溢出。
先說一下GString的結構體定義
GString
typedef struct {gchar *str;gsize len; gsize allocated_len; } GString;
這里就不用多解釋了,str是字符串的指針,len是字符串長度,allocated_len是前面說的會多申請一段內存,申請的大小是由一定的算法,并不是保留一個固定值,下面的例子程序中有相關的效果,可以留意一下。
然后是glib提供的功能函數:
Synopsis
#include <glib.h>GString; GString* g_string_new (const gchar *init); GString* g_string_new_len (const gchar *init,gssize len); GString* g_string_sized_new (gsize dfl_size); GString* g_string_assign (GString *string,const gchar *rval); #define g_string_sprintf #define g_string_sprintfa void g_string_vprintf (GString *string,const gchar *format,va_list args); void g_string_append_vprintf (GString *string,const gchar *format,va_list args); void g_string_printf (GString *string,const gchar *format,...); void g_string_append_printf (GString *string,const gchar *format,...); GString* g_string_append (GString *string,const gchar *val); GString* g_string_append_c (GString *string,gchar c); GString* g_string_append_unichar (GString *string,gunichar wc); GString* g_string_append_len (GString *string,const gchar *val,gssize len); GString* g_string_append_uri_escaped (GString *string,const char *unescaped,const char *reserved_chars_allowed,gboolean allow_utf8); GString* g_string_prepend (GString *string,const gchar *val); GString* g_string_prepend_c (GString *string,gchar c); GString* g_string_prepend_unichar (GString *string,gunichar wc); GString* g_string_prepend_len (GString *string,const gchar *val,gssize len); GString* g_string_insert (GString *string,gssize pos,const gchar *val); GString* g_string_insert_c (GString *string,gssize pos,gchar c); GString* g_string_insert_unichar (GString *string,gssize pos,gunichar wc); GString* g_string_insert_len (GString *string,gssize pos,const gchar *val,gssize len); GString* g_string_overwrite (GString *string,gsize pos,const gchar *val); GString* g_string_overwrite_len (GString *string,gsize pos,const gchar *val,gssize len); GString* g_string_erase (GString *string,gssize pos,gssize len); GString* g_string_truncate (GString *string,gsize len); GString* g_string_set_size (GString *string,gsize len); gchar* g_string_free (GString *string,gboolean free_segment);GString* g_string_up (GString *string); GString* g_string_down (GString *string);guint g_string_hash (const GString *str); gboolean g_string_equal (const GString *v,const GString *v2);
用下面的函數創建新的GString變量: GString *g_string_new( gchar *init ); 這個函數創建一個GString,將字符串值init復制到GString中,返回一個指向它的指針。 如果init參數是NULL,創建一個空GString。?
void g_string_free( GString *string, gint free_segment ); 這個函數釋放string所占據的內存。
free_segment參數是一個布爾類型變量。如果 free_segment參數是TRUE,它還釋放其中的字符數據。
?GString *g_string_assign( GString *lval, const gchar *rval ); 這 個函數將字符從rval復制到lval,銷毀lval的原有內容。注意,如有必要, lval會被加長以容納字符串的內容。這一點和標準的字符串復制函數strcpy( )相同。下面的函數的意義都是顯而易見的。
其中以_ c結尾的函數接受一個字符,而不是字符串。?
截取string字符串,生成一個長度為len的子串: GString *g_string_truncate( GString *string, gint len );?
將字符串val追加在string后面,返回一個新字符串: GString *g_string_append( GString *string, gchar *val );?
將字符c追加到string后面,返回一個新的字符串: GString *g_string_append_c( GString *string, gchar c );?
將字符串val插入到string前面,生成一個新字符串: GString *g_string_prepend( GString *string, gchar *val );?
將字符c插入到string前面,生成一個新字符串: GString *g_string_prepend_c( GString *string, gchar c );?
將一個格式化的字符串寫到string中,類似于標準的sprint f函數: void g_string_sprintf( GString *string, gchar *fmt, . . . ) ;?
將一個格式化字符串追加到string后面,與上一個函數略有不同: void g_string_sprintfa ( GString *string, gchar *fmt, ... );
下面用一個例子程序說明幾個常用函數的用法
運行結果: