从C中的字符串数组创建字符串

时间:2014-04-17 10:06:32

标签: c string

我的任务是编写一个函数,将char**作为参数并返回char*。 char *必须指向一个以null结尾的字符串,该字符串是char **中每个字符串的串联。

我该如何处理?
有些地方建议循环遍历char**并使用strcat()来构建字符串,但是strcat()要求我有足够大的目标来保存最终字符串;而且我不知道字符串的大小。我应该通过询问strlen()的每个元素char**来找出它的大小吗?

在C中执行此操作的最佳方式是什么?

5 个答案:

答案 0 :(得分:3)

可能的方法:

  • char**进行迭代,为每个条目累积strlen(char*)的结果。
  • 为终止空字符的累计长度添加一个。
  • 使用malloc()为字符串分配内存,并将第一个字符设置为空终止符(以确保第一次正确运行strcat())。
  • 使用strcat()再次迭代。

记录调用者负责free()返回的字符串。

答案 1 :(得分:2)

有两种主要方法可以做到这一点:

  • 对所有字符串进行初始传递,并对所有strlen s
  • 求和
  • NULL字符串开头并遍历字符串。当您迭代realloc目的地以适应尺寸增加时

答案 2 :(得分:0)

是的,你最好计算所需的所有空间,这样你就可以为新字符串提供足够的空间。

为所有字符串创建空间后,只需复制它们之间可能有空格字符(但如果添加空格,请不要忘记将它们计入分配...)

答案 3 :(得分:0)

这里有一个函数在库中执行此操作:http://sourceforge.net/projects/libxc/

实际功能记录为here

(是的,我是该项目的所有者,不,我不赚钱)

答案 4 :(得分:0)

您可能需要考虑以下注释代码(live here on Ideone.com)。

总结:

  1. 使用strlen()遍历输入字符串数组,计算结果字符串的总长度,对输入字符串的长度求和。
  2. 使用malloc()为结果字符串分配内存。
  3. 再次迭代输入数组,使用strcat()连接输入字符串。

  4. #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;
    }