私が Python と PHP で気に入っている点の 1 つは、配列から簡単に文字列を作成できることです。
Python: ', '.join(['a', 'b', 'c'])
PHP: implode(', ', array('a', 'b', 'c'));
しかし、これを C で実装するための直感的で明確な方法を誰かが持っているかどうか疑問に思っていました。ありがとう!
確かに、方法はあります-何も組み込まれていません。多くの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-配列要素ターミネーター規則を使用しました)。
たとえば、GLibにはg_strjoinとg_strjoinvという関数があります。おそらく、より大きなライブラリにはそのような機能があります。
最も簡単な方法は、そのようなライブラリを使用して幸せになることです。これを自分で書くのもそれほど難しくありません(他の答えを見てください)。「大きな」問題は、これらの文字列を割り当てたり解放したりするときに注意する必要があるということです。それはCです;-)
編集:両方の例の配列で使用したことがわかります。つまり、ご存知のとおり、g_strjoinvはあなたが求めていたものです。
ここでANSICでこれを行う関数を見つけました。私はそれを適応させ、セパレーター引数を追加しました。使用後は必ず文字列を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;
}