将数组展平为字符串

时间:2011-10-08 19:20:02

标签: c arrays

我有一个数组是“ NULL - 终止的NULL数组 - 终止字符串”。这由char **args给出。

我可以使用args[0]args[1]等访问单个元素。我想获取整个数组并将所有元素展平为字符串。如果数组包含:

args[0] = "abc"
args[1] = "def"

我想要一个结果字符串:

abcdef

我尝试通过遍历所有元素并将它们连接在一起来做到这一点,但我不知道如何告诉我何时到达数组的末尾,因为sizeof()不起作用。

5 个答案:

答案 0 :(得分:4)

  

我有一个数组是“以NULL结尾的以NULL结尾的字符串数组”。

数组以NULL结尾,只要您args[i] == NULL停止迭代。

答案 1 :(得分:2)

当你得到一个NULL元素时,你知道你已经到达了数组的末尾。{/ p>

if (args[i] == NULL){
    //DONE
}

如果你想获得数组args的长度,你可以循环遍历它,直到得到一个null,计算迭代次数:

int length_of_args = 0;
while (args[length_of_args] != NULL){
    length_of_args++;
} 

有人发布了类似的问题array is null terminated,其中包含一些您可能会发现有用的答案。

答案 2 :(得分:1)

你正在寻找这样的东西:

char* concat_string_array(char** input)
{
    int i, len;
    char* result;

    len = 1;
    for (i=0; input[i]; i++)
        len += strlen(input[i]);

    result = malloc(len);
    result[0] = '\0';
    for (i=0; input[i]; i++)
        result = strcat(result, input[i]);

    return result;
}

我相信你缺少的关键部分是数组以NULL条目终止。这就是for循环中的测试。

答案 3 :(得分:0)

您可以使用sprintf连接2个字符串。您需要控制新字符串的大小。这样的事情:

int main ()
{
    char* s1 = "abc";
    char *s2 = "def";

    char* snew = (char *)malloc (strlen (s1) + strlen (s2) + 1);

    sprintf (snew, "%s%s", s1, s2);
    printf ("%s\n", snew);

    return EXIT_SUCCESS;
}

答案 4 :(得分:0)

在C99:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char* args[] = { "hello", "my", "world", NULL};
    size_t str_size = 0;
    char** args_itr = args;
/* calculate resulting size */
    while(*args_itr != NULL) {
        str_size += strlen(*args_itr);
        args_itr++;
    }
    char result[str_size+1];
    result[str_size] = '\0'; // protect against 0 size                                                                                                                                          
    args_itr = args;
    char* result_ptr = result;
    while(*args_itr != NULL) {
        strcpy(result_ptr, *args_itr);
        result_ptr += strlen(*args_itr);
        args_itr++;
    }
    /* if you use it in a lib function you could do */
    // return strdup(result);                                                                                                                                                                   

    printf("%s\n", result);
    return 0;
}