亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2105 | 回復(fù): 0
打印 上一主題 下一主題

Glib庫基礎(chǔ) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-02-04 16:45 |只看該作者 |倒序?yàn)g覽

                GLib
1.1 Introduction
在開源世界中,G中很常見的。 它代表了GNU ("GNU's Not Unix")。 像GTK+,GLib,GObject,以及GNOME,還有一些其它的軟件包,如Ghostscript和gcc中都充滿了G。
為了理解后面的章節(jié),你必須學(xué)習(xí)一些GLib的基礎(chǔ)知識(shí)(libglib-2.0)。它為GTK+和GNOME程序提供了基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和實(shí)用函 數(shù)。在本章中將會(huì)涉及到GLib的結(jié)構(gòu)和API的介紹。 你將會(huì)在第二章中學(xué)習(xí)GLib's object system(GObject)。
在你使用GNOME和GTK+的時(shí)候,會(huì)不可避免的使用GLib。 其它的一些庫,如ORBit除了GLib并沒有引用其它的庫。 GLib所提供的abstractions(這個(gè)不知道應(yīng)該譯成什么)和實(shí)用工具編程程序提供了方便, 而且很容易移植到其它平臺(tái)。
在本章中并沒有包含圖形操作代碼,它只是一個(gè)簡單的,逐步講述了GLib的函數(shù)和數(shù)據(jù)結(jié)構(gòu)。 可能讀起來有點(diǎn)枯燥,不過你也可以直接跳到第三章去閱讀GTK+的內(nèi)容。 但是你會(huì)經(jīng)常的返回來查看這前兩章的內(nèi)容。
GLib Reference
http://library.gnome.org/devel/glib/unstable/index.html
1.2 GLib Naming Coventions (GLib命名規(guī)則)
就像許多其它的庫一下,GLib也為了一致性和易讀性規(guī)范了命名規(guī)則。
函數(shù)的名字一般都是小寫的,并且在每部分名字之間加下劃線, 如g_timer_new(),g_list_append()。并且所有的函數(shù)名字都是以g_開頭。
在GLib中,所有的函數(shù)都有前綴g_。
類型名并不包含下劃線,并且GLib里面的所有類型組件都是以大寫字母G開頭的,如GTimer,GList。但GLib中的基本類型是值得注意的例外。在第三節(jié)中將會(huì)有介紹。
如果某個(gè)函數(shù)主要是操作某個(gè)特定的類型的話,這個(gè)函數(shù)的前綴就與相應(yīng)的類型相匹配。例如,g_timer_*就是操作GTimer類型。 g_list_*就是操作GList類型。
這些規(guī)則聽起來比實(shí)際要復(fù)雜。
1.3 Basic Types (基本類型)
在開始使用GLib之前,你首先要適應(yīng)GLib的基本類型。 你或許很想知道為什么使用guchar要比使用unsigned char好。 如果你的程序一直待在同一個(gè)平臺(tái)上執(zhí)行,那么使用guchar與使用unsigned char并沒有實(shí)質(zhì)的差別。 但是,如果你想編寫出在不同平臺(tái)之間移植的程序,如Windows和Unix之間。 那你會(huì)很感謝GLib將基本類型給你抽象出來了。
例如,你想在所有可能的平臺(tái)上定義16位的無符號(hào)整型,使用C語言的話可能看起來很麻煩。但幸運(yùn)的是GLib幫你處理了這些。 所有的基本類型在下面的表格中列出。
要使用GLib和它的類型,必須要在源碼中包含glib.h
#include
gpointer和gconstpointer類型在GLib的數(shù)據(jù)結(jié)構(gòu)中經(jīng)常出現(xiàn),這兩個(gè)是無類型的內(nèi)存指針。在GLib中,函數(shù)負(fù)責(zé)檢查這兩個(gè)指針的類型,程序員和編譯器并不管這些。這在回調(diào)函數(shù)以及排序和遍歷中比較的時(shí)候尤其方便。
在GLib的頭文件中為gboolean類型定義了TRUE和FALSE常量。 在使用這些常量的時(shí)候,不要使用比較運(yùn)算符。 例如要用:if (my_gboolean),而不是:if (my_gboolean == TRUE)。
GLib Type
Corresponding Type in C
gchar
char
ugchar
unsigned char
gint
int
guint
unsigned int
gshort
short
gushort
unsigned short
glong
long
gulong
unsigned long
gfloat
float
gdouble
double
gint8
int, 8 bits wide
guint8
unsigned int, 8 bits wide
gint16
int, 16 bits wide
guint16
unsigned int, 16 bits wide
gint32
int, 32 bits wide
guint32
unsigned int, 32 bits wide
gint64
int, 64 bits wide
guint64
unsigned int, 64 bits wide
gpointer
void *, untyped pointer
gconstpointer
const void *, constant untyped pointer
gboolean
Boolean value, either TRUE or FALSE
1.4 Basic Utilities
(基本函數(shù),這個(gè)Utilities不知道如何譯,就寫成函數(shù)吧,因?yàn)楹竺娲_實(shí)在講函數(shù),嘿嘿……)
為了簡化你的程序與C語言以及系統(tǒng)的交互,GLib提供了大量的函數(shù)。 要了解GLib的函數(shù)處理數(shù)據(jù)結(jié)構(gòu)部分,請看1.5節(jié)。
1.4.1 內(nèi)存管理
如果你使用GLib提供的內(nèi)存管理例程,它可以避免你處理很多讓你頭痛的事。 GLib提供了的附加的錯(cuò)誤檢查與偵測。在下面的表格中為C程序員提供了一個(gè)參考。
你可以使用g_malloc(),g_realloc(),g_free()來代替malloc(),realloc(),free(),它們提供了相同的處理方式。為了將申請的內(nèi)存在使用前清零,你可以使用g_malloc0()。 注意,它的語法看起來像malloc,而不是calloc()。
GLib Function
Corresponding C Function
gpointer g_malloc(gulong n_bytes)
void *malloc(size_t size) with error handling
gpointer g_malloc0(gulong n_bytes)
like malloc(), but initializes memory as in calloc()
gpointer g_try_malloc(gulong n_bytes)
like malloc() without error checking
gpointer g_realloc(gpointer mem, gulong n_bytes)
void *realloc(void *ptr, size_t size) with error checking
gpointer g_try_realloc(gpointer mem, gulong n_bytes)
realloc() without error checking
void g_free(gpointer mem)
void free(void *ptr)


注意: 如果你有一些特殊的原因要使用函數(shù)的返回值的話,你可以使用g_try_malloc()和g_try_realloc(),如果出錯(cuò)的時(shí)候,它們會(huì)返回NULL。 你可以在某些不是非常關(guān)鍵的地方使用(如某些用來提高性能的額外緩沖區(qū)),或者某些測試的時(shí)候。
自然,如果你想覆蓋GLib的保護(hù)機(jī)制,你必須要清楚你在做什么。 對大多數(shù)程序來說,這些像g_malloc()的普通函數(shù)能節(jié)約你大量的代碼、錯(cuò)誤、以及時(shí)間。
一般情況下,你沒有必要為malloc或g_malloc指定具體的要申請的塊的大小。一般都是使用sizeof()來告訴編譯器或運(yùn)行時(shí)系統(tǒng)申請某種類型的某個(gè)倍數(shù)。 為了與數(shù)據(jù)類型相符,你必須要將malloc()返回值進(jìn)行強(qiáng)制轉(zhuǎn)換。 強(qiáng)制轉(zhuǎn)換要用大量的括號(hào)和星號(hào),所以GLib提供了一些宏,如g_new(),g_new0()以及g_renew()。 下面是一些示例代碼。
view plain
copy to clipboard
print
?
typedef struct _footype footype;  footype *my_data;  /* Allocate space for three footype structures (long version) */  my_data = (footype *) g_malloc(sizeof(footype)*3);  /* The abbreviated version using g_new */  my_data = g_new(footype, 3);  /* To initialize the memory to 0, use g_new0 */  my_data = g_new0(footype, 3);  /* Expand this block of memory to four structures (long version) */  my_data = (footype *) g_realloc(my_data, sizeof(footype)*4);  /* Shorter version */  my_data = g_renew(my_data, 4);   


在上面的代碼段中你可以清楚地看出,g_new()是g_malloc()的簡化,g_renew()是g_realloc()的簡易形式,g_new0()是g_malloc0()的簡易形式。
警告:記住你在使用g_new()時(shí)需要一個(gè)類型,就像使用sizeof()一樣。 有時(shí)候像這樣的的語句會(huì)產(chǎn)生編譯錯(cuò)誤:
b = g_new(a, 1) (a只是一個(gè)變量,而不是類型)
產(chǎn)生錯(cuò)誤的原因就是因?yàn)間_new只是一個(gè)宏,應(yīng)該給它傳遞類型,而不是某個(gè)類型的變量。




內(nèi)存塊
GUI程序一般傾向于重復(fù)申請大小相同的內(nèi)存塊(原子)。而且,那兒有一些相關(guān)的原子內(nèi)存(atom)。GLib使用了一種稱為“memory chunks”的方法為程序提供了相應(yīng)的原子內(nèi)存。一個(gè)內(nèi)存塊由一些原子內(nèi)存組成的;所以塊的大小肯定是原子內(nèi)存大小的整數(shù)倍。
這兒有一個(gè)使用g_mem_chunk_new()來申請塊的例子:
view plain
copy to clipboard
print
?
GMemChunk my_chunk;  my_chunk = g_mem_chunk_new("My Chunk",         /* name */                             42,                 /* atom size */                             42*16,              /* block size */                             G_ALLOC_AND_FREE);  /* access mode */   g_mem_chunk_new()有四個(gè)參數(shù),第一個(gè)參數(shù)是內(nèi)存塊的名字,第二個(gè)參數(shù)是原子內(nèi)存的大小(在這里是42),第三個(gè)參數(shù)是塊的總共大小,最后一個(gè)參數(shù)是訪問模式。這個(gè)函數(shù)的返回值是指向GMemChunk的指針。
注意: GMemChunk并不是一個(gè)數(shù)據(jù)結(jié)構(gòu)。它是一個(gè)內(nèi)存管理系統(tǒng),它管理的內(nèi)存片斷里面含有數(shù)據(jù)結(jié)構(gòu)。
第四個(gè)參數(shù)“訪問模式”為你提供了如何創(chuàng)建和申請?jiān)觾?nèi)存。一共有兩種方式:
G_ALLOCC_AND_FREE允許內(nèi)存池在任何時(shí)間返回單個(gè)的原子內(nèi)存。
G_ALLOC_ONLY僅允許在處理整個(gè)內(nèi)存塊的時(shí)候申請?jiān)觾?nèi)存。使用這個(gè)模式要比使用G_ALLOC_AND_FREE高效。
下面的例子指示了如何申請或釋放原子內(nèi)存。
view plain
copy to clipboard
print
?
gchar *data[50000];  gint i;  /* allocate 40,000 atoms */  for(i = 0; i {    data = g_mem_chunk_alloc(my_chunk);  }  /* allocate 10,000 more atoms and initialize them */  for(i = 40000; i {    data = g_mem_chunk_alloc0(my_chunk);  }  /* free one atom */  g_mem_chunk_free(my_chunk, data[42]);   

在這里,g_mem_chunk_alloc()和g_mem_chunk_alloc0()都可以申請單獨(dú)的原子內(nèi)存。這兩個(gè)函數(shù)像g_malloc()和g_malloc0()一樣,返回一個(gè)指向原子內(nèi)存的指針,但是,他們使用GMemChunk結(jié)構(gòu)而不是大小作為參數(shù)。g_mem_chunk_free()函數(shù)使用指向單獨(dú)原子內(nèi)存的指針來做為參數(shù),它將釋放的內(nèi)存返回到內(nèi)存池中。
警告: 使用g_mem_chunk_free來釋放原子內(nèi)存的時(shí)候,該原子內(nèi)存所在的內(nèi)存塊必須是使用G_ALLOC_AND_FREE模式創(chuàng)建的。除此之外,使用g_free()來釋放原子內(nèi)存的時(shí)候?qū)?huì)引起一個(gè)段錯(cuò)誤。產(chǎn)生段錯(cuò)誤的原因是因?yàn)閮?nèi)存塊的釋放函數(shù)將會(huì)導(dǎo)致兩次調(diào)用free()。

有一些函數(shù)會(huì)一次性的在整個(gè)內(nèi)存塊上操作原子內(nèi)存。下面的例子展示了這些函數(shù)的用法。
view plain
copy to clipboard
print
?
/* free up any unused atoms */  g_mem_chunk_clean(my_chunk);  /* free all unused atoms in all memory chunks */  g_blow_chunks();  /* deallocate all atoms in a chunk */  g_mem_chunk_reset(my_chunk);  /* deallocate a memory chunk */  g_mem_chunk_destroy(my_chunk);   


g_mem_chunk_clean(chunk)會(huì)檢查chunk并且釋放那些不再使用的內(nèi)存。這個(gè)例程給你提供了一些手工管理基本內(nèi)存的方式。g_mem_chunk_free()函數(shù)并不必須立即釋放原子內(nèi)存。只有在方便或者必須的時(shí)候,GLib才會(huì)釋放它。g_mem_chunk_clean()強(qiáng)迫它立即釋放。
g_blow_chunks()會(huì)在程序中所有的outstanding內(nèi)存塊中運(yùn)行g(shù)_mem_chunk_clean()。
g_mem_chunk_reset(chunk)會(huì)釋放chunk中的所有原子內(nèi)存,包括那些在使用的。你要小心使用這個(gè)函數(shù),因?yàn)樗赡軙?huì)釋放掉仍要使用的原子內(nèi)存。
g_mem_chunk_destroy(chunk)會(huì)釋放包括chunk本身以及chunk中的所有原子內(nèi)存。

在內(nèi)存管理上面,GLib為你提供了一些宏來減少你的輸入。
view plain
copy to clipboard
print
?
typedef struct _footype footype;  GMemChunk *pile_of_mem;  footype *foo;  /* create a memory chunk with space for 128 footype atoms */  pile_of_mem = g_mem_chunk_new("A pile of memory",                               sizeof(footype),                               sizeof(footype)*128,                               G_ALLOC_AND_FREE);  /* the same thing, with g_mem_chunk_create */  /* the name will be "footype mem chunks (128)" */  pile_of_mem = g_mem_chunk_create(footype, 128, G_ALLOC_AND_FREE);  /* allocate an atom */  foo = (footype *) g_mem_chunk_alloc(pile_of_mem);  /* the same thing, with g_mem_chunk_new */  foo = g_mem_chunk_new(footype, pile_of_mem);  /* the same thing, but zero out the memory */  foo = g_mem_chunk_new0(footype, pile_of_mem);   


從上面這些代碼中,可以很容易的明白這些宏的意圖。注意,如果你知道原子內(nèi)存的類型的話,g_mem_chunk_create()是一個(gè)比g_mem_chunk_new()更簡單的方法。還有,每個(gè)宏都會(huì)自動(dòng)地將塊名字拼湊起來。 g_mem_chunk_new()和g_mem_chunk_new0()是與g_new()和g_new0()相對應(yīng)的用來操作內(nèi)存塊的函數(shù)。
如果你想知道當(dāng)前內(nèi)存塊的統(tǒng)計(jì)數(shù)字,使用g_mem_chunk_print(chunk)可以得到一個(gè)簡單的報(bào)告。 使用g_mem_chunk_info()可以得到所有內(nèi)存塊的詳細(xì)信息。



1.4.2 Quarks (夸克)
為了在程序中標(biāo)識(shí)一塊數(shù)據(jù),你一般有兩種方式可選:數(shù)字或字符串。但是這兩者都有一些缺點(diǎn)。數(shù)字是非常難以辨認(rèn)的。如果你開始粗略的知道需要多少標(biāo)簽,你就可以定義一個(gè)枚舉類型和一些字符符號(hào)。但是,你沒法在運(yùn)行的時(shí)候動(dòng)態(tài)添加標(biāo)簽。
另一方面,你可以在運(yùn)行的時(shí)候動(dòng)態(tài)的添加或修改字符串,而且它們是很容易理解的。 但是,字符串比較要比數(shù)字比較花更長的時(shí)間,而且在內(nèi)存中管理字符串有一些你可能不愿意處理的額外麻煩。

GLib提供了GQuark類型,它整合了數(shù)字的簡單和字符串的易用。在它內(nèi)部,它就是一個(gè)易于比較和復(fù)制的整形數(shù)。GLib將這些數(shù)字映射為你的字符串,并且你可以在任何時(shí)間取得字符串所對應(yīng)的值。
要?jiǎng)?chuàng)建一個(gè)quark,使用下面兩個(gè)函數(shù)之一:
view plain
copy to clipboard
print
?
GQuark quark;  gchar *string;  quark = g_quark_from_string(string);  quark = g_quark_from_static_string("string");   


這兩個(gè)函數(shù)都是以字符串作為它們唯一的參數(shù)。它們的區(qū)別是g_quark_from_string()會(huì)在映射的時(shí)候創(chuàng)建一個(gè)字符串的拷貝,但是g_quark_from_static_string()并不會(huì)。
警告:小心使用g_quark_from_static_string()。在每次執(zhí)行它的時(shí)候會(huì)節(jié)約很少的CPU和內(nèi)存,但是,在你的程序中增加了附加的依賴性可能會(huì)導(dǎo)致你的程序有一些bug,所以,或許節(jié)約的那一點(diǎn)開銷并不值得你去使用該函數(shù)。

如果你想檢驗(yàn)?zāi)硞(gè)字符串是否有一個(gè)quark值,調(diào)用:
g_quark_try_string(string)
這個(gè)函數(shù)的返回值是該字符串所對應(yīng)的quark值。如果返回0的話,說明沒有與這個(gè)字符串相對應(yīng)的quark值。
從quark恢復(fù)到string使用:
string = g_quark_to_string(quark);
如果它執(zhí)行成功,它將會(huì)返回quark對應(yīng)的字符串的指針。但是你不能在這個(gè)指針上調(diào)用free(),因?yàn)檫@個(gè)字符串并不是一個(gè)拷貝。
下面是一個(gè)簡短的示例代碼:
view plain
copy to clipboard
print
?
GQuark *my_quark = 0;  my_quark = g_quark_from_string("Chevre");  if (!g_quark_try("Cottage Cheese"))  {    g_print("There isn't any quark for \"Cottage Cheese\"\n");  }  g_print("my_quark is a representation of %s\n", g_quark_to_string(my_quark));   

注意:GQuark值是分配給字符串的數(shù)字,并且很容易測試它們的等同性。然而,它們并沒有數(shù)字順序。你不能用quark值來進(jìn)行字母順序測試。因此,你不能用它們作為排序關(guān)鍵字。如果你想比較quark所代表的字符串,你必須先用g_quark_to_string()來提取相應(yīng)的字符串,然后才可以使用strcmp()或g_ascii_strcasecmp()。


1.4.3 C字符串
GLib提供了一些字符串函數(shù)來與標(biāo)準(zhǔn)C庫進(jìn)行交互(不要對GString疑惑,在1.5.1節(jié)將會(huì)講到)。你可以用這些字符串函數(shù)來擴(kuò)充或代替stringf()、strdup()或strstr()等。
下面的這些函數(shù)會(huì)返回一個(gè)新的字符串緩沖區(qū)的指針,所以你在使用完后必須要釋放它們。
gchar *g_strdup(const gchar *str)
復(fù)制str并返回它的一個(gè)拷貝。
gchar *g_strndup(const gchar *str, gsize n)
返回str中前n個(gè)字符的一個(gè)拷貝。這個(gè)拷貝總會(huì)在最后附加一個(gè)NULL結(jié)束符。
gchar *strnfill(gsize length, gchar *fill_char)
創(chuàng)建一個(gè)長度為length并被fill_char填充的字符串。
gchar *g_strdup_printf(const gchar *format, ...)
像sprintf()一樣格式化字符串和參數(shù)。但是,你沒必要像sprintf()一樣創(chuàng)建和指定一個(gè)緩沖區(qū),GLib將這些自動(dòng)做了。
gchar *g_strdup_vprintf(const gchar *format, va_list args)
類似于上面的那個(gè)函數(shù),它跟vsprintf()類似,使用C的可變參數(shù)能力,有關(guān)可變參數(shù)可以在stdarg(3)的手冊中找到。
gchar *g_strescape(const gchar *source, const gchar *exception)
將一些特殊控制字符轉(zhuǎn)換成相應(yīng)的ASCII,如,將Tab轉(zhuǎn)成\t,這些轉(zhuǎn)換有:退格(\b)、換頁(\f)、換行(\n)、回車(\r)、反斜線(\變成\\),雙引號(hào)(" 變成 \")。任何附加的非ASCII字符會(huì)轉(zhuǎn)換成相應(yīng)的8進(jìn)制表示(例如escape會(huì)變成\27)。你可以在字符串的exceptions中指定任何特定的例外。
gchar *g_strcompress(const gchar *source)
與g_strescape()相反,它是將ASCII格式的字符串轉(zhuǎn)為真正的控制字符。
gchar *g_strconcat(const gchar *string1, ..., NULL)
它接受任意數(shù)量的string作為參數(shù),并返回它們的連接后的字符串。你必須將NULL作為這個(gè)函數(shù)的最后一個(gè)參數(shù)。
gchar *g_strjoin(const gchar *separator, ..., NULL)
連接一些字符串,并且添加分隔符在每個(gè)字符串之間。如gstrjoin("|", "foo", "bar", NULL)會(huì)產(chǎn)生"foo|bar"。像g_strconcat(),你也必須將NULL作為最后一個(gè)參數(shù)傳給這個(gè)函數(shù)。如果將separtor參數(shù)設(shè)為NULL的話,g_strjoin()就會(huì)等同于g_strconcat()了。

在下面的函數(shù)中,你應(yīng)該為返回的結(jié)果申請空間。GLib并不會(huì)返回一個(gè)拷貝給你。它們與C相對應(yīng)的函數(shù)非常像,參數(shù)要包含一個(gè)足夠大的緩沖區(qū)來進(jìn)行字符串處理。
gchar *g_stpcpy(gchar *dest, const gchar *src)
拷貝src到dest,包括最后的NULL字符。如果它執(zhí)行成功,會(huì)返回dest中結(jié)束符拷貝的指針。它在進(jìn)行高效的字符串連接時(shí)是非常有用的。
gint g_snprintf(gchar *string, gulong n, const gchar *format, ...)
像snprintf()一樣,你必須確保string有足夠大的空間。而且你必須要用n來指定這個(gè)緩沖區(qū)的大小。返回值是輸出字符串的長度,也有可能這個(gè)輸出字符串為了適應(yīng)緩沖區(qū)的大小而被截?cái)唷_@是C99的標(biāo)準(zhǔn),并不只是你機(jī)子上傳統(tǒng)C庫的行為。
gint g_vsnprintf(gchar *string, gulong n, const gchar *format, va_list list)
跟上個(gè)函數(shù)類似,不過是變長參數(shù)。
gchar *g_strreverse(gchar *string)
將string里面的字符順序反轉(zhuǎn)。返回值仍然是string。
gchar *g_strchug(gchar *string)
將string開頭的空白字符都移除。將string中相應(yīng)的字符進(jìn)行左移,返回string。
gchar *g_strchomp(gchar *string)
將string結(jié)尾的空格都刪掉,返回string
gchar *g_strstrip(gchar *string)
將string開頭的結(jié)尾的空白字符都刪掉,返回string。
gchar *g_strdelimit(gchar *string, const gchar *delimiters, gchar *new_delimiter)
將string中的delimiters替換為new_delimiter。如果delimiters是NULL的話,這個(gè)函數(shù)會(huì)使用" _-|. "; 這些是G_STR_DELIMITERS中的標(biāo)準(zhǔn)集。返回值是string。
gchar *g_strcanon(gchar *string, const gchar *valid_chars, gchar *substituter)
將string中的,不屬于valid_chars中字符的那些字符都替換為substituer。返回string。注意,這個(gè)函數(shù)是g_strdelimit的一個(gè)補(bǔ)充。


在下面的函數(shù)中,除了g_ascii_dtostr()之外,都不改變它們的參數(shù)。
gchar *g_strstr_len(const gchar *haystack, gssize haystack_len, const gchar *needle)
在haystack中遍歷haystack_len長度,如果找到了needle字串,則返回這個(gè)位置的指針,如果沒有找到則返回NULL。
gchar *g_strrstr(const gchar *haystack, const gchar *needle)
類似于上個(gè)函數(shù),這個(gè)函數(shù)將會(huì)從后面開始查找,但是它并沒有haystack_len參數(shù)。
gchar *g_strrstr_len(gchar *haystack, gssize haystack_len, gchar *needle)
與g_strrstr()相同,但是它只在前haystack_len個(gè)字符中查找。
gsize g_printf_string_upper_bound(const gchar *format, va_list args)
檢查format和args,返回格式化后所需要緩沖區(qū)的最大值。
gdouble g_ascii_strtod(const gchar *nptr, gchar **endptr)
將string轉(zhuǎn)為雙字長度的浮點(diǎn)數(shù)。如果你提供了一個(gè)有效的endptr指針地址,這個(gè)函數(shù)會(huì)將指針設(shè)置到string中被轉(zhuǎn)換的最后一個(gè)字符的位置。與strtod()的區(qū)別是這個(gè)函數(shù)忽略了C locale。
gchar *g_ascii_dtostr(gchar *buffer, gint buf_len, gdouble d)
將d轉(zhuǎn)換為ASCII字串。將轉(zhuǎn)換后的忽略C locale然后寫入到buffer中,最大長度為buf_len。目標(biāo)字串的長度永遠(yuǎn)不會(huì)超過G_ASCII_DTOSTR_BUF_SIZE。這個(gè)函數(shù)返回buffer的指針。
注意:使用g_ascii_strtod()和g_ascii_dtostr()來讀寫文件或數(shù)據(jù)流,并不都是人可讀的。 因?yàn)檫@些函數(shù)使用統(tǒng)一的標(biāo)準(zhǔn),是區(qū)域無關(guān)的格式,為了解決某些特定的問題。 例如,一些人將本地設(shè)為German,然后運(yùn)行你的程序,你無須擔(dān)心本地化的數(shù)字之間逗號(hào)和句點(diǎn)的意義轉(zhuǎn)換。


最后,這兒列出一些操作字符串?dāng)?shù)組的函數(shù)。 NULL指針來表示這些數(shù)組的結(jié)束。
gchar **g_strsplit(const gchar *string, const gchar *delimiter, gint max_tokens)
使用delimiter來將string切割成至多max_tokens個(gè)部分。返回值是新申請的一個(gè)字符串?dāng)?shù)組,用來保存被切割的這些部分。這個(gè)字符串?dāng)?shù)組必須由你自己釋放。 如果輸入字符串是空的,這個(gè)返回值也是一個(gè)空的數(shù)組。
gchar *g_str_joinv(const gchar *separator, gchar **str_array)
將字符串?dāng)?shù)組組合成單個(gè)字符串,并將這個(gè)新申請的字符串返回。如果separator不空,g_str_joinv()會(huì)在每個(gè)字符串之間添加上一個(gè)separator分隔符。
gchar **g_strdupv(gchar **str_array)
返回str_array的一個(gè)完整拷貝。
void **g_strfreev(gchar **str_array)
釋放str_array數(shù)組以及這些字符串。
警告: 除了g_strfreev()之外,不要使用其它的函數(shù)來釋放像g_strsplit()或g_strdupv()創(chuàng)建的字符數(shù)組
               
               
               
               
               
               
               

本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u2/88891/showart_2177950.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP