2011-10-08 76 views
3

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

我可以使用args[0],args[1]等访问单个元素。我想要整个数组并将所有元素拼合成一个字符串。如果数组包含:

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

我希望得到的字符串是:

abcdef 

我试图通过所有元素循环和连接它们放在一起这样做,但我不知道该怎么告诉我什么时候到达阵列的末尾,因为sizeof()不起作用。

回答

4

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

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

2

作为您的array is null terminated,您知道在获取NULL元素时已达到数组的末尾。

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

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

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

有人张贴了类似的问题Copy argv to string in C(newbie question)与你可能会发现一些有用的答案。

+0

'sizeof'将决定数组的大小,但只有当你真正给它的阵列。问题是OP只有一个指向数组的指针,而不是数组本身。 –

+0

对,你好,谢谢! –

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; 
} 
+0

在这种情况下,你是在控制之下,但作为一个规则,应该**永远不会使用sprintf **。使用** snprintf **。只使用这个规则,它可以减少错误带来的收益。另外,在你的代码中,'snew'应该多分配1个字节来为结尾\ 0字符串终止字符留出空间。 – RushPL

+0

你是对的第二个,我编辑了我的答案。至于从未使用sprintf,你可能也是正确的,它恰好工作。所以我认为我会放弃它。 – rahmu

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循环中的测试检查。

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; 
}