如何在 C 中的循环中将字符串附加到字符串数组?

How do I append a string to an array of strings within a loop in C?

考虑到每次添加的值(因此指针指向的值正在改变),我正在努力了解如何将字符串附加到字符串数组。我希望 array 的格式为 {"hello, "helloo", ...},但我无法让它工作。我可以做哪些更改以便 array 正确存储它?

int size = 10;
char *string = "hello";
char c = "o";
char *array[size];

for (int i = 0; i < 10; i++) {
    strcat(string, c);
    array[i] = string;
}

哎呀...这里有很多错误!

让我们回到基础:C 语言没有字符串的概念。在语言级别,您只有(单个)字符类型:char。在库级别,字符串由空终止字符数组表示。

因此,为了能够将字符添加到字符串中,您必须具有正确维度的数组。顺便说一句,像 "hello" 这样的乱码是一个常量字符数组:程序员不能对其进行任何更改。

所以在这里您希望能够向“hello”添加 1 到 10 个字符,因此您需要一个 16 个字符的数组:5 个字符表示 hello,10 个字符表示额外的 o,1 个字符表示 null。但这还不是全部,array 只是一个指针数组。如果 array 的所有元素都指向您添加字符的同一个字符串,那么最后它们都将具有完全相同的值!您必须让数组的每个元素指向不同的字符数组。假设 strdup 可用,你可以这样写:

int size = 10;
char string[16] = "hello";  // build an array of size 16 initialized to "hello"
const char *c = "o";        // beware a string literal IS const
char *array[size];

for (int i = 0; i < 10; i++) {
    strcat(string, c);
    array[i] = strdup(string);  // build a dynamic copy
}

当您不再需要 array 时,您应该释放所有分配给 strdup:

的字符串
for (int i = 0; i < 10; i++) {
    free(array[i]);
}

顺便说一句,strdup 仅在 C23 之后的标准 C 库中,它以前只是一个 POSIX 扩展。如果在您的系统上不可用,您可以自己滚动:

char *strdup(const char *src) {
    char *dest = malloc(1 + strlen(src));
    strcpy(dest, src);
    return dest;
}

或者,您可以使用真正的二维数组来避免动态分配:

int size = 10;
char string[16] = "hello";  // build an array of size 16 initialized to "hello"
const char *c = "o";        // beware a string literal IS const
char *array[size][16];      // this is an array of 10 strings of size 16

for (int i = 0; i < 10; i++) {
    strcat(string, c);
    strcpy(array[i], string);
}

除非字符串是动态分配的,否则需要预先确定大小。此外,char str_name[size] 是字符串的定义方式。

int size = 10;
char string[size + 5] = "hello";
char c[2] = "o";
char* array[size];

for (int i = 0; i < size; i++) {
    array[i] = string;
    strcat(string, c);
}