如何从字符串数组中创建一个字符串C

问题描述:

我正在学习数组,并想知道是否有人可以帮助我。我有一个字符串数组,需要创建一个新的字符串,它是所有数组元素的串联。我遇到的问题是我只能打印我的数组中的第一个字符串,而不是所有的字符串。我知道我的数组中的每个字符串末尾都有一个空值,那么我将如何解决该问题?也许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! –

更改函数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我在你的文章中改进了代码的格式。请接受编辑,看起来更清晰 –

你必须在你的代码的几个问题,这里是固定版本注释:

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! –