3_02_GLib库入门与实践_字符串处理函数

简介

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]#
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值