Glib學習(5) 字串 Strings_glib

來源:互聯網
上載者:User

先上說明文檔網址:http://web.mit.edu/barnowl/share/gtk-doc/html/glib/glib-Strings.html


學過物件導向語言的同學一定都知道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_sprintfavoid                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, ... );


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

#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;}

運行結果:

linux@ubuntu:~/16021/glibdemo$ gcc -o gstring gstring.c -lglib-2.0linux@ubuntu:~/16021/glibdemo$ ./gstring g_string_new("Justin"); len = 6, allocated_len = 16g_string_new_len("Justin", 32); len = 32, allocated_len = 64g_string_sized_new(32); len = 0, allocated_len = 64g_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 = 32g_string_prepend(string, "prepend str!"); string:prepend str!firstg_string_insert(string, sizeof("prepend str!") , "insert str!"); prepend str!insert str!firstg_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: ABCDEFGABCDEFGDown: abcdefgabcdefglinux@ubuntu:~/16021/glibdemo$ 








聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.