我的任务是编写一个函数,将char**
作为参数并返回char*
。 char *必须指向一个以null结尾的字符串,该字符串是char **中每个字符串的串联。
我该如何处理?
有些地方建议循环遍历char**
并使用strcat()
来构建字符串,但是strcat(
)要求我有足够大的目标来保存最终字符串;而且我不知道字符串的大小。我应该通过询问strlen()
的每个元素char**
来找出它的大小吗?
在C中执行此操作的最佳方式是什么?
答案 0 :(得分:3)
可能的方法:
char**
进行迭代,为每个条目累积strlen(char*)
的结果。malloc()
为字符串分配内存,并将第一个字符设置为空终止符(以确保第一次正确运行strcat()
)。strcat()
再次迭代。记录调用者负责free()
返回的字符串。
答案 1 :(得分:2)
有两种主要方法可以做到这一点:
strlen
s NULL
字符串开头并遍历字符串。当您迭代realloc
目的地以适应尺寸增加时答案 2 :(得分:0)
是的,你最好计算所需的所有空间,这样你就可以为新字符串提供足够的空间。
为所有字符串创建空间后,只需复制它们之间可能有空格字符(但如果添加空格,请不要忘记将它们计入分配...)
答案 3 :(得分:0)
答案 4 :(得分:0)
您可能需要考虑以下注释代码(live here on Ideone.com)。
总结:
strlen()
遍历输入字符串数组,计算结果字符串的总长度,对输入字符串的长度求和。malloc()
为结果字符串分配内存。strcat()
连接输入字符串。#include <stdio.h> /* For printf() */
#include <stdlib.h> /* For malloc(), free() */
#include <string.h> /* For strcat(), strlen() */
/*
* Concatenates input strings into a single string.
* Returns the pointer to the resulting string.
* The string memory is allocated with malloc(),
* so the caller must release it using free().
* The input string array must have NULL as last element.
* If the input string array pointer is NULL,
* NULL is returned.
* On memory allocation error, NULL is returned.
*/
char * ConcatenateStrings(const char** strings)
{
int i = 0; /* Loop index */
int count = 0; /* Count of input strings */
char * result = NULL; /* Result string */
int totalLength = 0; /* Length of result string */
/* Check special case of NULL input pointer. */
if (strings == NULL)
{
return NULL;
}
/*
* Iterate through the input string array,
* calculating total required length for destination string.
* Get the total string count, too.
*/
while (strings[i] != NULL)
{
totalLength += strlen(strings[i]);
i++;
}
count = i;
totalLength++; /* Consider NUL terminator. */
/*
* Allocate memory for the destination string.
*/
result = malloc(sizeof(char) * totalLength);
if (result == NULL)
{
/* Memory allocation failed. */
return NULL;
}
/*
* Concatenate the input strings.
*/
for (i = 0; i < count; i++)
{
strcat(result, strings[i]);
}
return result;
}
/*
* Tests the string concatenation function.
*/
int main(void)
{
/* Result of string concatenation */
char * result = NULL;
/* Some test string array */
const char * test[] =
{
"Hello ",
"world",
"!",
" ",
"Ciao ",
"mondo!",
NULL /* String array terminator */
};
/* Try string concatenation code. */
result = ConcatenateStrings(test);
/* Print result. */
printf("%s\n", result);
/* Release memory allocated by the concatenate function. */
free(result);
/* All right */
return 0;
}