中科院云平台架构师,专注于数字化、智能化,技术方向:云、Linux内核、AI、MES/ERP/CRM/OA、物联网、传感器、大数据、ML、微服务。
分类: C/C++
2021-06-18 19:25:31
1.4.3 C字符串
GLib提供了一些字符串函数来与标准C库进行交互(不要对GString疑惑,在1.5.1节将会讲到)。你可以用这些字符串函数来扩充或代替stringf()、strdup()或strstr()等。
下面的这些函数会返回一个新的字符串缓冲区的指针,所以你在使用完后必须要释放它们。
gchar *g_strdup(const gchar *str)
复制str并返回它的一个拷贝。
gchar *g_strndup(const gchar *str, gsize n)
返回str中前n个字符的一个拷贝。这个拷贝总会在最后附加一个NULL结束符。
gchar *strnfill(gsize length, gchar *fill_char)
创建一个长度为length并被fill_char填充的字符串。
gchar *g_strdup_printf(const gchar *format, ...)
像sprintf()一样格式化字符串和参数。但是,你没必要像sprintf()一样创建和指定一个缓冲区,GLib将这些自动做了。
gchar *g_strdup_vprintf(const gchar *format, va_list args)
类似于上面的那个函数,它跟vsprintf()类似,使用C的可变参数能力,有关可变参数可以在stdarg(3)的手册中找到。
gchar *g_strescape(const gchar *source, const gchar *exception)
将一些特殊控制字符转换成相应的ASCII,如,将Tab转成/t,这些转换有:退格(/b)、换页(/f)、换行(/n)、回车(/r)、反斜线(/变成//),双引号(" 变成 /")。任何附加的非ASCII字符会转换成相应的8进制表示(例如escape会变成/27)。你可以在字符串的exceptions中指定任何特定的例外。
gchar *g_strcompress(const gchar *source)
与g_strescape()相反,它是将ASCII格式的字符串转为真正的控制字符。
gchar *g_strconcat(const gchar *string1, ..., NULL)
它接受任意数量的string作为参数,并返回它们的连接后的字符串。你必须将NULL作为这个函数的最后一个参数。
gchar *g_strjoin(const gchar *separator, ..., NULL)
连接一些字符串,并且添加分隔符在每个字符串之间。如gstrjoin("|", "foo", "bar", NULL)会产生"foo|bar"。像g_strconcat(),你也必须将NULL作为最后一个参数传给这个函数。如果将separtor参数设为NULL的话,g_strjoin()就会等同于g_strconcat()了。
在下面的函数中,你应该为返回的结果申请空间。GLib并不会返回一个拷贝给你。它们与C相对应的函数非常像,参数要包含一个足够大的缓冲区来进行字符串处理。
gchar *g_stpcpy(gchar *dest, const gchar *src)
拷贝src到dest,包括最后的NULL字符。如果它执行成功,会返回dest中结束符拷贝的指针。它在进行高效的字符串连接时是非常有用的。
gint g_snprintf(gchar *string, gulong n, const gchar *format, ...)
像snprintf()一样,你必须确保string有足够大的空间。而且你必须要用n来指定这个缓冲区的大小。返回值是输出字符串的长度,也有可能这个输出字符串为了适应缓冲区的大小而被截断。这是C99的标准,并不只是你机子上传统C库的行为。
gint g_vsnprintf(gchar *string, gulong n, const gchar *format, va_list list)
跟上个函数类似,不过是变长参数。
gchar *g_strreverse(gchar *string)
将string里面的字符顺序反转。返回值仍然是string。
gchar *g_strchug(gchar *string)
将string开头的空白字符都移除。将string中相应的字符进行左移,返回string。
gchar *g_strchomp(gchar *string)
将string结尾的空格都删掉,返回string
gchar *g_strstrip(gchar *string)
将string开头的结尾的空白字符都删掉,返回string。
gchar *g_strdelimit(gchar *string, const gchar *delimiters, gchar *new_delimiter)
将string中的delimiters替换为new_delimiter。如果delimiters是NULL的话,这个函数会使用" _-|<>. "; 这些是G_STR_DELIMITERS中的标准集。返回值是string。
gchar *g_strcanon(gchar *string, const gchar *valid_chars, gchar *substituter)
将string中的,不属于valid_chars中字符的那些字符都替换为substituer。返回string。注意,这个函数是g_strdelimit的一个补充。
在下面的函数中,除了g_ascii_dtostr()之外,都不改变它们的参数。
gchar *g_strstr_len(const gchar *haystack, gssize haystack_len, const gchar *needle)
在haystack中遍历haystack_len长度,如果找到了needle字串,则返回这个位置的指针,如果没有找到则返回NULL。
gchar *g_strrstr(const gchar *haystack, const gchar *needle)
类似于上个函数,这个函数将会从后面开始查找,但是它并没有haystack_len参数。
gchar *g_strrstr_len(gchar *haystack, gssize haystack_len, gchar *needle)
与g_strrstr()相同,但是它只在前haystack_len个字符中查找。
gsize g_printf_string_upper_bound(const gchar *format, va_list args)
检查format和args,返回格式化后所需要缓冲区的最大值。
gdouble g_ascii_strtod(const gchar *nptr, gchar **endptr)
将string转为双字长度的浮点数。如果你提供了一个有效的endptr指针地址,这个函数会将指针设置到string中被转换的最后一个字符的位置。与strtod()的区别是这个函数忽略了C locale。
gchar *g_ascii_dtostr(gchar *buffer, gint buf_len, gdouble d)
将d转换为ASCII字串。将转换后的忽略C locale然后写入到buffer中,最大长度为buf_len。目标字串的长度永远不会超过G_ASCII_DTOSTR_BUF_SIZE。这个函数返回buffer的指针。
注意:使用g_ascii_strtod()和g_ascii_dtostr()来读写文件或数据流,并不都是人可读的。 因为这些函数使用统一的标准,是区域无关的格式,为了解决某些特定的问题。 例如,一些人将本地设为German,然后运行你的程序,你无须担心本地化的数字之间逗号和句点的意义转换。
最后,这儿列出一些操作字符串数组的函数。 NULL指针来表示这些数组的结束。
gchar **g_strsplit(const gchar *string, const gchar *delimiter, gint max_tokens)
使用delimiter来将string切割成至多max_tokens个部分。返回值是新申请的一个字符串数组,用来保存被切割的这些部分。这个字符串数组必须由你自己释放。 如果输入字符串是空的,这个返回值也是一个空的数组。
gchar *g_str_joinv(const gchar *separator, gchar **str_array)
将字符串数组组合成单个字符串,并将这个新申请的字符串返回。如果separator不空,g_str_joinv()会在每个字符串之间添加上一个separator分隔符。
gchar **g_strdupv(gchar **str_array)
返回str_array的一个完整拷贝。
void **g_strfreev(gchar **str_array)
释放str_array数组以及这些字符串。
警告: 除了g_strfreev()之外,不要使用其它的函数来释放像g_strsplit()或g_strdupv()创建的字符数组