如何在c中使用字符串数组

时间:2012-01-11 14:55:23

标签: c linux arrays

我想使用与此相同的字符串数组:

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

在我没有问题得到价值之后,例如:

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

我有问题将新字符串插入此数组,就像这样!? :

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

4 个答案:

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

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

希望这有帮助!