2016-03-02 184 views
0

我正在學習數組,並想知道是否有人可以幫助我。我有一個字符串數組,需要創建一個新的字符串,它是所有數組元素的串聯。我遇到的問題是我只能打印我的數組中的第一個字符串,而不是所有的字符串。我知道我的數組中的每個字符串末尾都有一個空值,那麼我將如何解決該問題?也許2D數組?順便說一下,我不允許使用string.h中的任何字符串操作函數。謝謝。如何從字符串數組中創建一個字符串C

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


int findLength(char array[]) 
{ 
    int i = 0; 
    for (i = 0; array[i] != '\0'; i++) 
    { 
    } 
    return i; 
} 

void arrayToString(char string[]) 
{ 
    int n = 0; 
    int i = 0; 
    int l = findLength(string); 
    char *finalString; 
    finalString = malloc(l * sizeof(char)); 
    for (i = 0; string[i] != '\0'; i++) { 
     finalString[n] = string[i]; 
     n++; 
    } 
    for (i = 0; finalString[i] != '\0'; i++) { 
     printf("%c", finalString[i]); 
    } 
} 

int main(int argc, const char * argv[]) 
{ 
    char *color[] = { "red", "blue", "red" }; 
    arrayToString(*color); 
    return 0; 
} 
+1

只是提示使用嵌套循環! – Cherubim

+0

'void arrayToString(char string [])'只接受單個字符串,因此只能對單個字符串進行操作。您需要將其更改爲如下所示:'void arrayToString(char * strings [],size_t len)'。請注意,傳遞數組的'len'非常重要,因爲它不能從函數內的數組本身派生。在完成之後,使用@ ch3rub7給出的提示。另外,不要忘了'免費'分配'finalString.' – kaylum

+0

謝謝@kaylum和@ ch3rub7! –

回答

0

更改函數arrayToStringchar **類型的兩個arguments.one和size_t類型的第二定義字符串的數量。也讓它的返回值爲char *返回一個指向分配內存的指針。最後不要忘記釋放這個內存。

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


int findLength(char array[]) { 
    int i = 0; 
    for (i = 0; array[i] != '\0'; i++) { 
    } 
    return i; 
} 

char* arrayToString(char **string, size_t size) { 
    int bigSize = 0, len; 
    int i = 0, j, k; 
    for (j = 0; j < size; j++) { 
     bigSize += findLength(string[j]); 
    } 
    char *bigstring = (char *)malloc(bigSize + 1); 
    for (j = 0; j < size; j++) { 
     len = findLength(string[j]); 
     for (k = 0; k < len; k++) { 
      bigstring[i++] = string[j][k]; 
     } 
    } 
    bigstring[i] = '\0'; 
    return bigstring; 
} 

int main(int argc, const char * argv[]) 
{ 
    char *color[] = { "red", "blue", "red" }; 
    char *bigstring = arrayToString(color, 3); 
    printf("%s\n", bigstring); 
    free(bigstring); 
    return 0; 
} 
+0

謝謝@ machine_1 –

+0

不客氣... –

+0

@AmirSankar我在你的文章中改進了代碼的格式。請接受編輯,看起來更清晰 –

0

你必須在你的代碼的幾個問題,這裏是固定版本註釋:

size_t findLength(char* array[]) { 
    size_t l = 0; 
    while (char *t = *array++) 
     while (*t++) 
      l++; 
    return l; 
} 

void copyAll(char* array[], char* out) { 
    while (char *t = *array++) 
     while (*t) 
      *out++ = *t++; // copy every symbol from every line into out string 
    *out = '\0'; // append last null-terminator 
} 

void arrayToString(char* array[]) { 
    char* finalString = malloc((findLength(array) + 1) * sizeof(char)); // allocate + 1 symbol for null terminator 
    copyAll(array, finalString); 
    printf("%s", finalString); 
    free(finalString); // don't forget to release memory 
} 

int main(int argc, char* argv[]) { 
    char* color[] = { "red", "blue", "red", 0 }; // you should add array terminator as well 
    arrayToString(color); 
    return 0; 
} 
+0

小數點。 OP表示「不允許使用string.h中的任何字符串操作函數」。所以不允許使用'strcpy','strlen'和'strcat'調用。 – kaylum

+0

@kaylum哦,錯過了,會修復 –

+0

謝謝@Lashane! –

相關問題