日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

glib字符串

發布時間:2023/11/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 glib字符串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學過面向對象語言的同學一定都知道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, ... );


下面用一個例子程序說明幾個常用函數的用法

[cpp]?view plain?copy
  • #include?<glib.h>??
  • ??
  • int?main(int?argc,char?**argv)?{??
  • ??
  • //????GString*?g_string_new(const?gchar?*init);???根據所給的字符串建立適當長度的GString,并自動創建適當長度的allocated_len,創建的時候將字符串init復制到GString中。??
  • ????GString?*string?=?g_string_new("Justin");??
  • ????g_print("g_string_new(\"Justin\");?len?=?%d,?allocated_len?=?%d\n",???
  • ????????????string->len,?string->allocated_len);??
  • ??????
  • //????若不使用GString時,可以使用g_string_free()釋放,第二個參數如果為TRUE,會連同字符串也是放掉。??
  • ????g_string_free(string,?TRUE);??????????????
  • ??
  • //????GString*?g_string_new_len(const?gchar?*init,?gssize?len);?????指定len來建立GString,因為是自行制定的長度,所以len必須超過init的長度。??
  • ????string?=?g_string_new_len("Justin",?32);??
  • ????g_print("g_string_new_len(\"Justin\",?32);?len?=?%d,?allocated_len?=?%d\n",???
  • ????????????string->len,?string->allocated_len);??????
  • ????g_string_free(string,?TRUE);??????????????
  • ??
  • //????GString*?g_string_sized_new(gsize?dfl_size);??????指定allocated_len建立GString,函數會根據需要的長度值自動分配長度,也就是不一定會分配設置的長度,但一定會比設定的長度大。??
  • ????string?=?g_string_sized_new(32);??
  • ????g_printf("g_string_sized_new(32);?len?=?%d,?allocated_len?=?%d\n",???
  • ????????????string->len,?string->allocated_len);???
  • ????g_string_free(string,?TRUE);?????
  • ??
  • ??
  • ????GString?*t=g_string_new("Hello?Laomeng.");??
  • ????GString?*s=g_string_new("Hello?Laoli.");??
  • ??????
  • //????g_string_equal()????判斷兩個GString的字符串內容是否相同??
  • ????if(g_string_equal(s,t))???
  • ????{??
  • ????????g_print("g_string_equal(s,t);?%s??==?%s\n",s->str,t->str);??
  • ????}???
  • ????else???
  • ????{??
  • ????????g_print("g_string_equal(s,t);?%s?!=?%s\n",s->str,t->str);??
  • ????}??
  • ????g_string_free(s,?TRUE);???
  • ????g_string_free(t,?TRUE);???
  • ??
  • ????string?=?g_string_new("first?str!");??
  • //?????GString*?g_string_append?(GString?*string,const?gchar?*val);?????在字符串string后面追加字符串val??
  • ????g_string_append(string,?"second?str!");??
  • ????g_print("g_string_append(string,?\"second?str!\");?%s\n",?string->str);??
  • ??
  • //????GString*?g_string_truncate(GString?*string,gsize?len);?截斷字符串,保留前len個字符??
  • ????g_string_truncate(string,5);??
  • ????g_print("g_string_truncate(string,5);??string:??%s,?len?=?%d,?allocated_len?=?%d\n",string->str,?string->len?,?string->allocated_len);??
  • ??
  • //?????GString*?g_string_prepend?(GString?*string,const?gchar?*val);?????在字符串string前面追加字符串val??
  • ????g_string_prepend(string,?"prepend?str!");??
  • ????g_print("g_string_prepend(string,?\"prepend?str!\");?string:%s\n",?string->str);??
  • ??
  • //?????GString*?g_string_insert?(GString?*string,gssize?pos,const?gchar?*val);?????將字符串插入到pos處??
  • ????g_string_insert(string,?sizeof("prepend?str!")-1?,?"insert?str!");??
  • ????g_print("g_string_insert(string,?sizeof(\"prepend?str!\")?,?\"insert?str!\");?%s\n",?string->str);??
  • ??
  • //????void?g_string_printf(GString?*string,?const?gchar?*format,?...);??格式化一個字符串,和sprintf用法一樣,只是賦值給一個GString,string里面以前的數據被銷毀了??
  • ????g_string_printf(string,"%d?+?%d?=?%d",?100,?200,?100+200);??
  • ????g_print("g_string_printf();?GString:?%s,?len?=?%d,?allocated_len?=?%d?\n",string->str,?string->len?,?string->allocated_len);??
  • ??
  • //????void?g_string_append_printf(GString?*string,?const?gchar?*format,?...);??格式化一個字符串,和g_string_printf很相似,只是不銷毀string里面的數據,而是在后面追加??
  • ????g_string_append_printf(string,"\t?%d?*?%d?=?%d",?100,200,100*200);??
  • ????g_print("g_string_append_printf();?GString:?%s,?len?=?%d,?allocated_len?=?%d?\n",string->str,?string->len?,?string->allocated_len);??
  • ??
  • ????g_string_free(string,TRUE);??
  • ??
  • ????string?=?g_string_new("abcdefgABCDEFG");??
  • ??
  • //????g_string_ascii_up()或g_utf8_strup()?轉換GString中的字符串為小寫??
  • ????g_string_ascii_up(string);??
  • ????g_printf("Upper:?%s\n",?string->str);??
  • //????g_string_ascii_down()或g_utf8_strdown()轉換GString中的字符串為大寫??
  • ????g_string_ascii_down(string);??
  • ????g_printf("Down:?%s\n",?string->str);??
  • ??
  • ????g_string_free(string,TRUE);??
  • ??
  • ????return?0;??
  • ??
  • }??

  • 運行結果:

    [plain]?view plain?copy
  • linux@ubuntu:~/16021/glibdemo$?gcc?-o?gstring?gstring.c?-lglib-2.0??
  • linux@ubuntu:~/16021/glibdemo$?./gstring???
  • g_string_new("Justin");?len?=?6,?allocated_len?=?16??
  • g_string_new_len("Justin",?32);?len?=?32,?allocated_len?=?64??
  • g_string_sized_new(32);?len?=?0,?allocated_len?=?64??
  • g_string_equal(s,t);?Hello?Laoli.?!=?Hello?Laomeng.??
  • g_string_append(string,?"second?str!");?first?str!second?str!??
  • g_string_truncate(string,5);??string:??first,?len?=?5,?allocated_len?=?32??
  • g_string_prepend(string,?"prepend?str!");?string:prepend?str!first??
  • g_string_insert(string,?sizeof("prepend?str!")?,?"insert?str!");?prepend?str!insert?str!first??
  • g_string_printf();?GString:?100?+?200?=?300,?len?=?15,?allocated_len?=?32???
  • g_string_append_printf();?GString:?100?+?200?=?300???100?*?200?=?20000,?len?=?34,?allocated_len?=?64???
  • Upper:?ABCDEFGABCDEFG??
  • Down:?abcdefgabcdefg??
  • linux@ubuntu:~/16021/glibdemo$ ??
  • 總結

    以上是生活随笔為你收集整理的glib字符串的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。