Короткий ответ: вы не можете.
Однако вы можете обойти это, используя массивы строк, возможно, динамически распределенные. Тогда вы могли бы использовать тот же метод, что и сейчас, но вместо этого перебирать массив.
Возможно что-то вроде этого:
char *strmaker(size_t count, char *strings[])
{
// First get the length of all strings in the array
size_t result_length = 0;
for (size_t i = 0; i < count; ++i)
{
// +1 for space between the strings
// And for the last string adds space for the string null-terminator
result_length += strlen(strings[i]) + 1;
}
// Now allocate the string (using calloc to initialize memory to zero, same as the string null-terminator)
char *result = calloc(1, result_length);
// And not concatenate all strings in the array into one large string
for (size_t i = 0; i < count; ++i)
{
strcat(result, strings[i]);
if (i != count - 1)
{
strcat(result, " "); // Add space, except after last string
}
}
// Return the resulting string
return string;
}
int main(int argc, char *argv[])
{
// Create an array for all arguments
char **arguments = malloc(sizeof(char *) * argc - 1);
for (int a = 1; a < argc)
{
arguments[a - 1] = argv[a];
}
// Now create the single string
char *result = strmaker(argc - 1, arguments);
// ... and print it
printf("%s\n", result);
// Finally clean up after us
free(result);
free(arguments);
}
Для аргументов командной строки в argv
вам действительно не нужно создавать новый массив для их хранения, но он демонстрирует, как создать массив строки для передачи в strmaker
. Вы можете использовать любые строки вместо аргументов командной строки.