【问题标题】:how to create a string from an array of strings C如何从字符串数组中创建一个字符串 C
【发布时间】:2016-03-02 19:41:11
【问题描述】:

我正在学习数组,想知道是否有人可以帮助我。我有一个字符串数组,需要创建一个新字符串,它是所有数组元素的串联。我遇到的问题是我只能打印数组中的第一个字符串,而不是全部。我知道我的数组中每个字符串的末尾都有一个空值,那么我将如何解决这个问题?也许二维数组?顺便说一句,我不允许使用 string.h 中的任何字符串操作函数。谢谢。

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

【问题讨论】:

  • 只是提示使用嵌套 for 循环!
  • void arrayToString(char string[]) 只接受单个字符串,因此只能对单个字符串进行操作。您需要将其更改为:void arrayToString(char *strings[], size_t len)。请注意,传入数组的len 非常重要,因为它不能从函数内的数组本身派生。在你这样做之后,然后使用@ch3rub7 给出的提示。另外,不要忘记free分配的finalString.
  • 谢谢@kaylum 和@ch3rub7!

标签: c arrays string multidimensional-array


【解决方案1】:

改变你的函数arrayToString 有两个参数。一个是char ** 类型,第二个是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;
}

【讨论】:

  • @AmirSankar 我改进了您帖子中代码的格式。请接受编辑,以便看起来更清晰
  • char* arrayToString(char **string, size_t size) 内部有a lot of conversions problems,应该修复。打开你的编译器警告,请不要投 malloc()Suggestion
【解决方案2】:

你的代码有几个问题,这里是带有 cmets 的固定版本:

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

【讨论】:

  • 次要。 OP 说“不允许使用 string.h 中的任何字符串操作函数”。所以不允许strcpystrlenstrcat 调用。
  • @kaylum 哦,错过了,会修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
相关资源
最近更新 更多