我想使用与此相同的字符串数组:
char arr[][20] = {"username1", "username2"};
在我没有问题得到价值之后,例如:
printf("%s", arr[0]); // for "username1"
我有问题将新字符串插入此数组,就像这样!? :
arr[2] = "username3"; // or sprintf(arr[2], "%s", "username3");
答案 0 :(得分:7)
您正尝试将char*
插入char[20]
数组中。那不行。您可以使用strcpy
作为
strcpy(arr[2], "username3");
如果您为第三个字符串分配了足够的空间,而您没有。我建议你阅读malloc
和朋友们;你不能只是在这个数组中追加一个字符串。
答案 1 :(得分:2)
通过这种静态初始化,arr
将不会动态调整大小以保存新条目(指向堆栈中条目的指针通常不喜欢被写入)。
为了实现这一点,arr
应为char **
并正确分配:
// allocate enough for three entries in arr
char **arr = (char **) malloc(3 * sizeof(char *));
答案 2 :(得分:1)
C没有内置的动态增长的数据结构。如果您想要一个可以容纳越来越多元素的数组,则需要涉及动态内存分配。这通常使用realloc()
函数来完成,该函数可用于分配然后重新分配内存块,以便您可以根据需要增加分配。
答案 3 :(得分:1)
这样做的错误方法如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char arr[][20] = {"username1", "username2"};
printf("%s\n", arr[0]);
printf("%s\n", arr[1]);
printf("sizeof arr : %d \n", sizeof(arr)/sizeof(*arr));
strcpy(arr[2],"username3");
printf("%s\n", arr[2]);
printf("sizeof arr : %d \n", sizeof(arr)/sizeof(*arr));
return 0;
}
因为,当你写下面的内容时
char arr[][20] = {"username1", "username2"};
第一个维度是根据给定的初始值设定项自动计算的,在这种情况下,它是2
(即索引0
和1
)。
稍后当您尝试访问(读取或写入)第三个元素,即索引2
时,它是一个未定义的行为。
如果你想增加2d数组的第一个维度,正确的做法如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 20
int main(void)
{
char **arr = NULL;
int n=2, n1;
int i;
if ((arr = malloc(sizeof(char *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
for (i=0; i<n ; i++) {
if ((arr[i] = malloc(sizeof(char) * LEN)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
}
strcpy(arr[0], "username1");
strcpy(arr[1], "username2");
printf("%s\n", arr[0]);
printf("%s\n", arr[1]);
/* add 5 more elements to arr */
n1 = 5;
if ((arr = realloc(arr, sizeof(char *) * (n + n1))) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
for (i=n; i<n1+n ; i++) {
if ((arr[i] = malloc(sizeof(char) * LEN)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
}
strcpy(arr[2], "username2");
strcpy(arr[3], "username3");
strcpy(arr[4], "username4");
strcpy(arr[5], "username5");
strcpy(arr[6], "username6");
/* if you uncomment the below, it will lead to undefined behavior */
//strcpy(arr[7], "username7");
for (i=0; i<n+n1 ; i++)
printf("%d : %s \n", i, arr[i]);
for (i=0; i<n+n1 ; i++)
free(arr[i]);
free(arr);
return 0;
}
$ ./a.out
username1
username2
0 : username1
1 : username2
2 : username2
3 : username3
4 : username4
5 : username5
6 : username6
$
希望这有帮助!