我喜欢Python和PHP的一件事是能够轻松地从数组中创建一个字符串:
Python: ', '.join(['a', 'b', 'c'])
PHP: implode(', ', array('a', 'b', 'c'));
但是,我想知道是否有人用直观而明确的方式在C中实现这一点。谢谢!
答案 0 :(得分: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-array-element终结符约定)。
答案 1 :(得分:5)
例如,GLib中有这样的功能:g_strjoin和g_strjoinv。可能任何更大的图书馆都有这样的功能。
最简单的方法是使用这样的库并且开心。自己写这个也不难(看其他答案)。 “大”问题只是在分配和释放这些字符串时必须小心。这是C; - )
编辑:我只是看到你在两个示例数组中都使用过。所以,只要你知道:g_strjoinv就是你要求的。
答案 2 :(得分: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;
}