2011-01-13 27 views
4

有一件事我喜欢Python和PHP是使从阵列字符串容易的能力:join()方法或用C破灭()

Python: ', '.join(['a', 'b', 'c']) 
PHP: implode(', ', array('a', 'b', 'c')); 

不过,我想知道是否有人有一个直观明了用C实现这个方法谢谢!

+0

我不知道是否有可以做这件事的任何库,但它应该是可行的与喜欢的char *破灭的函数(字符*分隔符,字符** strArray,诠释strElementCount){}。第三个参数需要知道如何解析strArray。但C并非设计时考虑到了字符串:) – 2011-01-13 14:53:12

+0

请不要忘记选择接受的答案。这使社区更好:-)。保护你! – Gregor 2011-01-15 13:03:07

回答

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; 
} 

它不是建立在主要的原因是因为C标准库是很小的;他们想让C的新实现变得容易,所以你不会找到很多效用函数。还有一个问题,C没有给你许多关于如何确定数组中元素数量的指导(我在上面的例子中使用了一个NULL数组元素终结符约定)。

5

例如在GLib中有这样一个函数:g_strjoing_strjoinv。可能任何更大的图书馆都有这样的功能。

最简单的方法是使用这样的库,并开心。自己写这个也不难(查看其他答案)。 “大”问题只是在分配和释放这些字符串时必须小心。它是C ;-)

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

+0

+1'这是C.'所以在那里。 – 2011-01-13 16:47:07

4

我发现了一个在ANSI C here中执行此操作的函数。我调整了它,并添加了分隔符参数。确保在使用后释放()字符串。

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; 
}