C中的join()或implode()

Sco*_*ott 4 c c-strings

我喜欢Python和PHP的一件事是能够轻松地从数组中创建一个字符串:

Python: ', '.join(['a', 'b', 'c'])
PHP: implode(', ', array('a', 'b', 'c'));
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否有人用直观而明确的方式在C中实现这一点.谢谢!

bdo*_*lan 9

当然,有一些方法 - 没有任何内置的东西.许多C实用程序库都具有此功能 - 例如,glib的g_strjoinv.您也可以自己滚动,例如:

static char *util_cat(char *dest, char *end, const char *str)
{
    while (dest < end && *str)
        *dest++ = *str++;
    return dest;
}

size_t join_str(char *out_string, size_t out_bufsz, const char *delim, char **chararr)
{
    char *ptr = out_string;
    char *strend = out_string + out_bufsz;
    while (ptr < strend && *chararr)
    {
        ptr = util_cat(ptr, strend, *chararr);
        chararr++;
        if (*chararr)
            ptr = util_cat(ptr, strend, delim);
    }
    return ptr - out_string;
}
Run Code Online (Sandbox Code Playgroud)

它没有内置的主要原因是因为C标准库非常小; 他们希望能够轻松地创建C的新实现,因此您找不到尽可能多的实用程序功能.还有一个问题是C没有给出很多指导,例如,如何确定数组中有多少元素(我在上面的例子中使用了NULL-array-element终结符约定).


orl*_*rlp 6

我在这里找到了一个在 ANSI C 中执行此操作的函数。我对其进行了修改并添加了分隔符参数。确保在使用字符串后对其进行 free() 操作。

char* join_strings(char* strings[], char* seperator, int count) {
    char* str = NULL;             /* Pointer to the joined strings  */
    size_t total_length = 0;      /* Total length of joined strings */
    int i = 0;                    /* Loop counter                   */

    /* Find total length of joined strings */
    for (i = 0; i < count; i++) total_length += strlen(strings[i]);
    total_length++;     /* For joined string terminator */
    total_length += strlen(seperator) * (count - 1); // for seperators

    str = (char*) malloc(total_length);  /* Allocate memory for joined strings */
    str[0] = '\0';                      /* Empty string we can append to      */

    /* Append all the strings */
    for (i = 0; i < count; i++) {
        strcat(str, strings[i]);
        if (i < (count - 1)) strcat(str, seperator);
    }

    return str;
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*gor 5

例如,GLib中有这样的函数:g_strjoing_strjoinv.可能任何更大的图书馆都有这样的功能.

最简单的方法是使用这些库并感到高兴.自己写这个也不难(看其他答案)."大"问题只是在分配和释放这些字符串时必须小心.这是C ;-)

编辑:我只是看到你在两个示例数组中都使用过.所以你知道:g_strjoinv就是你要求的.