2011-10-08 74 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; 
}