简介
GLib提供了一组处理字符串的函数,比标准C库更容易使用,还没有内存越界的风险,非常方便。
数据结构
无
函数列表
gchar * g_strdup ()
gchar * g_strndup ()
gchar ** g_strdupv ()
gchar * g_strnfill ()
gchar * g_stpcpy ()
gchar * g_strstr_len ()
gchar * g_strrstr ()
gchar * g_strrstr_len ()
gboolean g_str_has_prefix ()
gboolean g_str_has_suffix ()
int g_strcmp0 ()
gchar * g_str_to_ascii ()
gchar ** g_str_tokenize_and_fold ()
gboolean g_str_match_string ()
gsize g_strlcpy ()
gsize g_strlcat ()
gchar * g_strdup_printf ()
gchar * g_strdup_vprintf ()
gint g_printf ()
gint g_vprintf ()
gint g_fprintf ()
gint g_vfprintf ()
gint g_sprintf ()
gint g_vsprintf ()
gint g_snprintf ()
gint g_vsnprintf ()
gint g_vasprintf ()
gsize g_printf_string_upper_bound ()
gboolean g_str_is_ascii ()
gboolean g_ascii_isalnum ()
gboolean g_ascii_isalpha ()
gboolean g_ascii_iscntrl ()
gboolean g_ascii_isdigit ()
gboolean g_ascii_isgraph ()
gboolean g_ascii_islower ()
gboolean g_ascii_isprint ()
gboolean g_ascii_ispunct ()
gboolean g_ascii_isspace ()
gboolean g_ascii_isupper ()
gboolean g_ascii_isxdigit ()
gint g_ascii_digit_value ()
gint g_ascii_xdigit_value ()
gint g_ascii_strcasecmp ()
gint g_ascii_strncasecmp ()
gchar * g_ascii_strup ()
gchar * g_ascii_strdown ()
gchar g_ascii_tolower ()
gchar g_ascii_toupper ()
GString * g_string_ascii_up ()
GString * g_string_ascii_down ()
gchar * g_strup ()
gchar * g_strdown ()
gint g_strcasecmp ()
gint g_strncasecmp ()
gchar * g_strreverse ()
gint64 g_ascii_strtoll ()
guint64 g_ascii_strtoull ()
gdouble g_ascii_strtod ()
gchar * g_ascii_dtostr ()
gchar * g_ascii_formatd ()
gdouble g_strtod ()
gchar * g_strchug ()
gchar * g_strchomp ()
#define g_strstrip()
gchar * g_strdelimit ()
gchar * g_strescape ()
gchar * g_strcompress ()
gchar * g_strcanon ()
gchar ** g_strsplit ()
gchar ** g_strsplit_set ()
void g_strfreev ()
gchar * g_strconcat ()
gchar * g_strjoin ()
gchar * g_strjoinv ()
guint g_strv_length ()
gboolean g_strv_contains ()
const gchar * g_strerror ()
const gchar * g_strsignal ()
函数功能分类
ASCII字符判断
gboolean g_str_is_ascii ()
gboolean g_ascii_isalnum ()
gboolean g_ascii_isalpha ()
gboolean g_ascii_iscntrl ()
gboolean g_ascii_isdigit ()
gboolean g_ascii_isgraph ()
gboolean g_ascii_islower ()
gboolean g_ascii_isprint ()
gboolean g_ascii_ispunct ()
gboolean g_ascii_isspace ()
gboolean g_ascii_isupper ()
gboolean g_ascii_isxdigit ()
格式化字符串
gint g_printf ()
gint g_vprintf ()
gint g_fprintf ()
gint g_vfprintf ()
gint g_sprintf ()
gint g_vsprintf ()
gint g_snprintf ()
gint g_vsnprintf ()
gint g_vasprintf ()
复制
gchar * g_strnfill ()
gchar * g_stpcpy ()
gchar * g_strdup ()
gchar * g_strndup ()
gchar ** g_strdupv ()
gsize g_strlcpy ()
gchar * g_strdup_printf ()
gchar * g_strdup_vprintf ()
查找
gchar * g_strstr_len ()
gchar * g_strrstr ()
gchar * g_strrstr_len ()
gboolean g_str_has_prefix ()
gboolean g_str_has_suffix ()
gboolean g_strv_contains ()
gboolean g_str_match_string ()
比较
int g_strcmp0 ()
gint g_strcasecmp ()
gint g_strncasecmp ()
gint g_ascii_strcasecmp ()
gint g_ascii_strncasecmp ()
格式转换
gchar * g_str_to_ascii ()
gchar * g_ascii_strup ()
gchar * g_ascii_strdown ()
gchar g_ascii_tolower ()
gchar g_ascii_toupper ()
GString * g_string_ascii_up ()
GString * g_string_ascii_down ()
gchar * g_strup ()
gchar * g_strdown ()
进制转换
gint64 g_ascii_strtoll ()
guint64 g_ascii_strtoull ()
gdouble g_ascii_strtod ()
gchar * g_ascii_dtostr ()
gchar * g_ascii_formatd ()
gdouble g_strtod ()
gboolean g_ascii_string_to_signed ()
gboolean g_ascii_string_to_unsigned ()
反转-逆序
gchar * g_strreverse ()
连接
gsize g_strlcat ()
gchar * g_strconcat ()
gchar * g_strjoin ()
gchar * g_strjoinv ()
去除空格
gchar * g_strchug ()
gchar * g_strchomp ()
#define g_strstrip()
分隔
gchar ** g_strsplit ()
gchar ** g_strsplit_set ()
替换
gchar * g_strcanon ()
gchar * g_strdelimit ()
字符串数组测长
guint g_strv_length ()
转义字符处理
gchar * g_strescape ()
gchar * g_strcompress ()
其他
void g_strfreev ()
const gchar * g_strerror ()
const gchar * g_strsignal ()
gchar ** g_str_tokenize_and_fold ()
gsize g_printf_string_upper_bound ()
gint g_ascii_digit_value ()
gint g_ascii_xdigit_value ()
函数功能说明及综合演示
ASCII字符判断
gboolean g_str_is_ascii () // 判断一个字符串是否全部由ascii字符组成
gboolean g_ascii_isalnum () // 一个字符是否为字母或数字组成
gboolean g_ascii_isalpha () // 一个字符是否为字母
gboolean g_ascii_iscntrl () // 一个字符是否为控制字符
gboolean g_ascii_isdigit () // 一个字符是否为数字
gboolean g_ascii_isgraph () // 一个字符是否为图形字符
gboolean g_ascii_islower () // 一个字符是否为小写字母
gboolean g_ascii_isprint () // 一个字符是否为可打印字符
gboolean g_ascii_ispunct () // 一个字符是否为标点符号
gboolean g_ascii_isspace () // 一个字符是否为空格
gboolean g_ascii_isupper () // 一个字符是否为大写字母
gboolean g_ascii_isxdigit () // 一个字符是否为十六进制数字
格式化字符串
g_printf_xxx函数族,类似于printf。
引用本函数族,需要包含glib/gprintf.h头文件
gint g_printf ()
gint g_vprintf ()
gint g_fprintf ()
gint g_vfprintf ()
gint g_sprintf ()
gint g_vsprintf ()
gint g_snprintf ()
gint g_vsnprintf ()
gint g_vasprintf ()
复制
gchar * g_strnfill () // 申请指定长度的字符串,以给定的字符进行填充。注意返回值需要自行释放!
gchar * g_stpcpy () // 类似于strcpy(),会将字符串结束符也拷贝进去。如果dest长度小于src,则会导致内存泄露。
gchar * g_strdup () // 同strdup
gchar * g_strndup () // 同strndup
gchar ** g_strdupv () // 深拷贝一个数组,返回的数组不使用时一定要释放内存。可以使用g_strfreev函数。
gsize g_strlcpy () //安全拷贝一个字符串。dest_size指dest的长度,最多拷贝dest_size-1个长度的字节到dest,结尾补'\0',如果src长度小于dest_size,则只会拷贝strlen(src)长度。
gchar * g_strdup_printf () // 字符串拼接然后复制。注意返回值需要释放。
gchar * g_strdup_vprintf () // 多字符串拼接然后复制。注意返回值需要释放。
查找
gchar * g_strstr_len () // 同strstr,但可以指定在字符串的指定长度内查找,而非整个字符串
gchar * g_strrstr () // 同strrstr
gchar * g_strrstr_len () // 同strrstr,但可以指定在字符串的指定长度内查找,而非整个字符串
gboolean g_str_has_prefix () // 字符串是否有前缀
gboolean g_str_has_suffix () // 字符串是否有后缀
gboolean g_strv_contains () // 在数组中查找是否有指定字符串。注意此接口在2.44版本之后才有。
gboolean g_str_match_string () // 字符串匹配。注意此接口并不仅仅支持ASCII字符串,还可支持非ASCII字符,还可识别单词。
比较
int g_strcmp0 () //同strcmp,但允许参数为空。注意C语言标准strcmp函数如果传入的参数为空可能会产生段错误。
gint g_strcasecmp () // 已废弃,请使用以下两个接口
gint g_strncasecmp () // 已废弃,请使用以下两个接口
gint g_ascii_strcasecmp () // 同strcasecmp和strncasecmp。允许参数为空。
gint g_ascii_strncasecmp () // 同strcasecmp和strncasecmp。允许参数为空。
格式转换
gchar * g_str_to_ascii () // utf-8字符串转换成纯ascii字符串
gchar * g_ascii_strup () // 字符串里面的小写字母全部转换成大写。返回的字符串是新的内存空间,需要调用者自己释放该内存。
gchar * g_ascii_strdown () // 字符串里面的大写字母全部转换成小写。返回的字符串是新的内存空间,需要调用者自己释放该内存。
gchar g_ascii_toupper () // 单个字符转换成大写
gchar g_ascii_tolower () // 单个字符转换成小写
GString * g_string_ascii_up () // 将GString类型的字符串所有小写字母转换成大写,转换完之后的字符串仍保存在GString变量,没有申请新的内存空间。
GString * g_string_ascii_down () // 将GString类型的字符串所有大写字母转换成小写,转换完之后的字符串仍保存在GString变量,没有申请新的内存空间。
gchar * g_strup () // 已废弃函数,请使用g_ascii_strup()或g_utf8_strup()
gchar * g_strdown () // 已废弃函数,请使用g_ascii_strdown()或g_utf8_strdown()
进制转换
gint64 g_ascii_strtoll () // 字符串转换成64位整数
guint64 g_ascii_strtoull () // 字符串转换成64位无符号整数
gdouble g_ascii_strtod () // 字符串转换成浮点型
gchar * g_ascii_dtostr () // 浮点型转换成字符串
gchar * g_ascii_formatd () // 浮点型转换成字符串,且可以按照指定格式转换
gdouble g_strtod () // 类似于g_ascii_strtod,但本接口不如g_ascii_strtod常用。
反转-逆序
gchar * g_strreverse () // 字符串逆序
连接
gsize g_strlcat () // 将src拷贝到dest中,最后一个参数是dest的长度,如果dest_size长度超过dest的实际长度,则会导致内存泄露。如果多次调用strlcat,则需要保证dest内存足够。如果src过长,则只会拷贝dest_size-1长度到dest,结尾补'\0'。
gchar * g_strconcat () // 将多个字符串拼接到一起,注意最后一个参数要为NULL。本函数会开辟新的内存空间,返回的字符串需要调用者自行释放内存。
gchar * g_strjoin () // 与g_strconcat相似,将多个字符串拼接到一起,但比g_strconcat多一个功能,即在每个拼接处插入一个分隔字符串。注意最后一个参数要为NULL。本函数也需要使用者自行释放返回的内存。
gchar * g_strjoinv () // 同g_strjoin,参数为字符串数组,该数组的最后一个元素需要为NULL,否则得到的字符串不是以'\0'结尾。返回值需要自行释放。
去除空格
// 去除头、尾、头和尾的空格
gchar * g_strchug ()
gchar * g_strchomp ()
#define g_strstrip()
分隔
gchar **
g_strsplit (const gchar *string,
const gchar *delimiter,
gint max_tokens); // 字符串分隔,返回的是字符串数组,需要用户自行释放内存。delimiter是分隔符,可以是单个字符,也可以是多个字符,如果是多个字符,需要保证字符的唯一性,如:不能以;;这种作为分隔符,否则会有意想不到的效果。max_tokens是最大分隔数,如果string中有多个分隔符,分隔到max_tokens个数后后面的就不再分隔,作为一个整体串存到字符串数组中。
gchar **
g_strsplit_set (const gchar *string,
const gchar *delimiters,
gint max_tokens); // g_strsplit_set和g_strsplit具有相同的参数,但第二个参数含义是分隔符集,每一个字符都是一个分隔符,其他和g_strsplit相同。
替换
gchar * g_strcanon (gchar *string,
const gchar *valid_chars,
gchar substitutor); // 如果string中的字符是valid_chars字符串中的字符,则不替换,否则逐个替换成新的substitutor字符。本接口不申请新的内存,第一个参数请不要传入常量字符串,返回值是string字符串的地址。
gchar * g_strdelimit (gchar *string,
const gchar *delimiters,
gchar new_delimiter); // 如果string中的字符是delimiters字符串中的字符,则替换成新的new_delimiter字符,否则不替换。本接口不申请新的内存,第一个参数请不要传入常量字符串,返回值是string字符串地址。
字符串数组测长
guint g_strv_length () // 对字符串数组进行测长
转义字符处理
// g_strescape是将字符串中的'\b', '\f', '\n', '\r', '\t', '\v', '\' '"'这些特殊字符前面加一个'\'。如char str[16] = {'a', '\n', 'b'};,调用g_strescape后,返回的数组为str_ret[]={'a', '\\', 'n', 'b'};。由于转义前后字符串长度发生了变化,因此返回的字符串是一个新的字符串,需要调用者自行释放内存。g_strescape的第二个参数是指在转义过程中保留的特殊字符,即这些字符不会被转义保存。g_strcompress是g_strescape的逆运算,将转义后的字符串再重新转回去。
gchar * g_strescape ()
gchar * g_strcompress ()
其他
void g_strfreev () // 释放字符串数组专用函数
const gchar * g_strerror () // 同strerror,将errno转换为字符串形式
const gchar * g_strsignal ()
gchar ** g_str_tokenize_and_fold ()
gsize g_printf_string_upper_bound ()
gint g_ascii_digit_value ()
gint g_ascii_xdigit_value ()
以上函数的综合演示如下:
源码见glib_examples\glib_strfunctions\glib_strfunctions_all
#include <glib.h>
#include <string.h>
void test_str_strnfill_func(void)
{
gchar *str1 = "aaaa";
gchar *str2 = NULL;
str2 = g_strnfill(4, 'a');
g_assert_cmpstr(str1, ==, str2);
g_free(str2);
}
void test_str_stpcpy_func(void)
{
gchar buff1[8] = {0};
// gchar buff2[4] = {0};
gchar *s1;
// gchar *s2;
g_stpcpy(buff1, "ABCDEF");
// g_stpcpy(buff2, "ABCDEF");
s1 = g_strdup(buff1);
// s2 = g_strndup(buff1, 3);
g_free(s1);
// g_free(s2);
}
void test_str_strlcpy_func(void)
{
gchar *str = "abcdeABCDE";
gchar buf1[8] = {0};
gchar buf2[16] = {0};
gchar buf3[32] = {0};
g_strlcpy(buf1, str, 8);
g_strlcpy(buf2, str, 16);
g_strlcpy(buf3, str, 32);
g_assert(7 == strlen(buf1));
g_assert(10 == strlen(buf2));
g_assert(10 == strlen(buf3));
}
void test_str_strdup_printf_func(void)
{
gchar *str0 = "AB10CDefgEND";
gchar *str = NULL;
str = g_strdup_printf("AB%dCD%sEND", 10, "efg");
g_assert_cmpstr(str0, ==, str);
g_free(str);
}
void test_str_strstr_len_func(void)
{
gchar *str0 = "ABCDabcdABCD";
gchar *str = NULL;
str = g_strstr_len(str0, strlen(str0), "CD");
g_assert_cmpstr("CDabcdABCD", ==, str);
}
void test_str_strrstr_func(void)
{
gchar *str0 = "ABCDabcdABCD";
gchar *str = NULL;
str = g_strrstr(str0, "cd");
g_assert_cmpstr("cdABCD", ==, str);
}
void test_str_strrstr_len_func(void)
{
gchar *str0 = "ABCDabcdABCD";
gchar *str = NULL;
str = g_strrstr_len(str0, 4, "cd");
g_assert(NULL == str);
}
void test_str_has_prefix_func(void)
{
gchar *str0 = "ABCDabcdABCD";
gboolean flag = FALSE;
flag = g_str_has_prefix(str0, "ABCD");
g_assert(flag);
flag = g_str_has_prefix(str0, "abcd");
g_assert(!flag);
}
void test_str_has_suffix_func(void)
{
gchar *str0 = "ABCDabcdABCD";
gboolean flag = FALSE;
flag = g_str_has_suffix(str0, "ABCD");
g_assert(flag);
flag = g_str_has_suffix(str0, "abcd");
g_assert(!flag);
}
void test_str_trans_func(void)
{
gchar *s1,*s2;
gchar *str1 = "ABCDabcd";
GString *string = NULL;
string = g_string_new("ABab");
s1 = g_ascii_strup(str1, 8);
s2 = g_ascii_strdown(str1, 8);
g_assert_cmpstr(s1, ==, "ABCDABCD");
g_assert_cmpstr(s2, ==, "abcdabcd");
g_string_ascii_up(string);
g_assert_cmpstr(string->str, ==, "ABAB");
g_string_ascii_down(string);
g_assert_cmpstr(string->str, ==, "abab");
g_free(s1);
g_free(s2);
g_string_free(string, TRUE);
}
void test_str_strlcat_func(void)
{
gchar dest[8] = {0};
g_strlcat(dest, "ABCDabcdABCD", 8);
g_assert_cmpstr(dest, ==, "ABCDabc");
memset(dest, 0, 8);
g_strlcat(dest, "AB", 8);
g_assert_cmpstr(dest, ==, "AB");
g_strlcat(dest, "CD", 8);
g_assert_cmpstr(dest, ==, "ABCD");
}
void test_str_strconcat_func(void)
{
gchar *str = NULL;
gchar *s = "AABB";
str = g_strconcat("aaaa", s, "1234", NULL);
g_assert_cmpstr(str, ==, "aaaaAABB1234");
g_free(str);
}
void test_str_strjoin_func(void)
{
gchar *str = NULL;
gchar *s = "AND";
str = g_strjoin(s, "aa", "bb", "cc", NULL);
g_assert_cmpstr(str, ==, "aaANDbbANDcc");
g_free(str);
}
void test_str_strjoinv_func(void)
{
gchar *str = NULL;
gchar *s = "AND";
gchar *arr[] = {"aa", "bb", "cc", NULL};
str = g_strjoinv(s, arr);
g_assert_cmpstr(str, ==, "aaANDbbANDcc");
g_free(str);
}
void test_str_strip_space_func(void)
{
gchar str1[16] = " abcd";
gchar str2[16] = "abcd ";
gchar *str3 = g_strdup(" abcd ");
g_strchug(str1);
g_strchomp(str2);
g_strstrip(str3);
g_assert_cmpstr(str1, ==, "abcd");
g_assert_cmpstr(str2, ==, "abcd");
g_assert_cmpstr(str3, ==, "abcd");
g_free(str3);
}
void test_str_split_func(void)
{
gchar *str1 = "doc;xls;ppt";
gchar *str2 = "docANDxlsANDppt";
gchar **strv = NULL;
gint i = 0;
strv = g_strsplit(str1, ";", -1);
g_assert_cmpstr(strv[0], ==, "doc");
g_assert_cmpstr(strv[1], ==, "xls");
g_assert_cmpstr(strv[2], ==, "ppt");
g_strfreev(strv);
strv = g_strsplit(str1, ";", 2);
g_assert_cmpstr(strv[0], ==, "doc");
g_assert_cmpstr(strv[1], ==, "xls;ppt");
g_strfreev(strv);
strv = g_strsplit(str2, "AND", -1);
g_assert_cmpstr(strv[0], ==, "doc");
g_assert_cmpstr(strv[1], ==, "xls");
g_assert_cmpstr(strv[2], ==, "ppt");
g_strfreev(strv);
}
void test_str_split_set_func(void)
{
gchar *str1 = "doc;xls,ppt";
gchar *str2 = "doc;,xls;,ppt";
gchar **strv = NULL;
gint i = 0;
strv = g_strsplit_set(str1, ";,", -1);
g_assert_cmpstr(strv[0], ==, "doc");
g_assert_cmpstr(strv[1], ==, "xls");
g_assert_cmpstr(strv[2], ==, "ppt");
g_strfreev(strv);
strv = g_strsplit(str2, ";,", -1);
g_assert_cmpstr(strv[0], ==, "doc");
g_assert_cmpstr(strv[1], ==, "xls");
g_assert_cmpstr(strv[2], ==, "ppt");
g_strfreev(strv);
strv = g_strsplit_set(str2, ";,", -1);
g_assert_cmpstr(strv[0], ==, "doc");
g_assert_cmpstr(strv[1], ==, "");
g_assert_cmpstr(strv[2], ==, "xls");
g_assert_cmpstr(strv[3], ==, "");
g_assert_cmpstr(strv[4], ==, "ppt");
g_strfreev(strv);
}
void test_str_strcanon_func(void)
{
gchar str[16] = "abcdefg";
g_strcanon(str, "acdf", '?');
g_assert_cmpstr(str, ==, "a?cd?f?");
}
void test_str_strdelimit_func(void)
{
gchar str[16] = "abcdABcdEFacbd";
g_strdelimit(str, "cd", 'X');
g_assert_cmpstr(str, ==, "abXXABXXEFaXbX");
}
void test_str_strescape_func(void)
{
gint i = 0;
gchar ori[16] = "a\rb\nc\td";
gchar *s1 = NULL, *s2 = NULL;
s1 = g_strescape(ori, "\t");
for(i=0;i<32;i++) {
//g_print("%d ", s1[i]);
}
//g_print("str:%s \n", s1);
g_assert_cmpstr(s1, ==, "a\\rb\\nc\td");
s2 = g_strcompress(s1);
for(i=0;i<32;i++) {
//g_print("%d ", s2[i]);
}
g_assert_cmpstr(s2, ==, ori);
g_free(s1);
g_free(s2);
}
gint main(gint argc, gchar **argv)
{
gint x = g_strcmp0(NULL, "aabb");
g_test_init(&argc, &argv, NULL);
g_test_add_func("/str/strnfill", test_str_strnfill_func);
g_test_add_func("/str/stpcpy", test_str_stpcpy_func);
g_test_add_func("/str/strlcpy", test_str_strlcpy_func);
g_test_add_func("/str/strdup_printf", test_str_strdup_printf_func);
g_test_add_func("/str/strstr_len", test_str_strstr_len_func);
g_test_add_func("/str/strrstr", test_str_strrstr_func);
g_test_add_func("/str/strrstr_len", test_str_strrstr_len_func);
g_test_add_func("/str/str_prefix", test_str_has_prefix_func);
g_test_add_func("/str/str_suffix", test_str_has_suffix_func);
g_test_add_func("/str/str_trans", test_str_trans_func);
g_test_add_func("/str/str_strlcat", test_str_strlcat_func);
g_test_add_func("/str/str_strconcat", test_str_strconcat_func);
g_test_add_func("/str/str_strjoin", test_str_strjoin_func);
g_test_add_func("/str/str_strjoinv", test_str_strjoinv_func);
g_test_add_func("/str/str_stripspace", test_str_strip_space_func);
g_test_add_func("/str/str_split", test_str_split_func);
g_test_add_func("/str/str_splitset", test_str_split_set_func);
g_test_add_func("/str/str_strcanon", test_str_strcanon_func);
g_test_add_func("/str/str_strdelimit", test_str_strdelimit_func);
g_test_add_func("/str/str_strescape", test_str_strescape_func);
return g_test_run();
}
运行结果:
[root@centos7 build]# ./glib_strfunctions_all
/str/strnfill: OK
/str/stpcpy: OK
/str/strlcpy: OK
/str/strdup_printf: OK
/str/strstr_len: OK
/str/strrstr: OK
/str/strrstr_len: OK
/str/str_prefix: OK
/str/str_suffix: OK
/str/str_trans: OK
/str/str_strlcat: OK
/str/str_strconcat: OK
/str/str_strjoin: OK
/str/str_strjoinv: OK
/str/str_stripspace: OK
/str/str_split: OK
/str/str_splitset: OK
/str/str_strcanon: OK
/str/str_strdelimit: OK
/str/str_strescape: OK
[root@centos7 build]#