应该如何处理字符串的阵列工作在C

应该如何处理字符串的阵列工作在C

问题描述:

我想用字符串数组与此相同:应该如何处理字符串的阵列工作在C

char arr[][20] = {"username1", "username2"}; 

后,我没有问题,得到的值,例如:

printf("%s", arr[0]); // for "username1" 

我有问题插入新的字符串到这个数组,这样的事情!? :

arr[2] = "username3"; // or sprintf(arr[2], "%s", "username3"); 
+0

+1 from me!好问题! – 2012-01-11 15:54:12

这样做的错误的方法是如下:

#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(即索引01)。

稍后当您尝试访问(读取或写入)第三个元素(即索引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 
$ 

希望这有助于!

+0

是啊!谢谢你,先生 :) – 2012-01-11 16:22:20

您正试图将char*插入到char[20]的数组中。这是行不通的。你可以使用strcpy作为

strcpy(arr[2], "username3"); 

如果您分配了足够的空间供第三字符串,你没有。我建议你阅读malloc和朋友;你不能仅仅向这个数组附加一个字符串。

+0

@NiklasBaumstark:很好,没有发现。 – 2012-01-11 15:01:28

+0

现在好多了。 – 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()函数来完成,该函数可用于分配并重新分配内存块,以便您可以根据需要增加分配。