应该如何处理字符串的阵列工作在C
我想用字符串数组与此相同:应该如何处理字符串的阵列工作在C
char arr[][20] = {"username1", "username2"};
后,我没有问题,得到的值,例如:
printf("%s", arr[0]); // for "username1"
我有问题插入新的字符串到这个数组,这样的事情!? :
arr[2] = "username3"; // or sprintf(arr[2], "%s", "username3");
这样做的错误的方法是如下:
#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
)时,它是未定义的行为。
如果你想增加一个二维数组的第一个维度,这样做会是如下的正确方法:
#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
$
希望这有助于!
是啊!谢谢你,先生 :) – 2012-01-11 16:22:20
您正试图将char*
插入到char[20]
的数组中。这是行不通的。你可以使用strcpy
作为
strcpy(arr[2], "username3");
如果您分配了足够的空间供第三字符串,你没有。我建议你阅读malloc
和朋友;你不能仅仅向这个数组附加一个字符串。
@NiklasBaumstark:很好,没有发现。 – 2012-01-11 15:01:28
现在好多了。 – 2012-01-11 15:02:54
使用此静态初始化,arr
将不会动态调整大小以保存新条目(指向堆栈中的条目的指针通常不喜欢被写入)。
为了这个工作,arr
应该是char **
和正确分配:
// allocate enough for three entries in arr
char **arr = (char **) malloc(3 * sizeof(char *));
C没有动态增长数据结构,内置。如果你想要一个可以容纳越来越多元素的数组,你需要涉及动态内存分配。这通常使用realloc()
函数来完成,该函数可用于分配并重新分配内存块,以便您可以根据需要增加分配。
+1 from me!好问题! – 2012-01-11 15:54:12