如何在 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);
}
考虑到每次添加的值(因此指针指向的值正在改变),我正在努力了解如何将字符串附加到字符串数组。我希望 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);
}