在C中动态初始化字符串数组

时间:2013-08-31 21:26:30

标签: c arrays

我知道我可以用这种方式初始化字符串数组:

static const char *BIN_ELEMENTS[5] = {
    "0000\0",           // 0
    "0001\0",           // 1
    "0010\0",           // 2
    "0011\0",           // 3
    "0100\0",           // 4
};

但我需要以动态的方式实现这一目标。从文件中读取字符,并将它们插入到数组中。然后将该数组复制到一个字符串数组中(如上所述)。

因此,假设我从文件中捕获了以下字符,并将它们插入到数组中,如下所示:

char number[5];
char *listOfNumbers[10];
number[0]='1';
number[1]='2';
number[2]='3';
number[3]='4';
number[4]='\0';

现在我想将数字的全部内容复制到listOfNumers[0] //中,这意味着我已将“1234”存储在listOfNumers的第0位。留下9个位置来存储不同的数字。

所以我会做这样的事情:

listOfNumers[0] = number; //this actually seems to work.

但由于它是一个巨大的数字文件,我需要重用数组编号,以提取一个新数字。但是当我这样做时,之前存储在listOfNumers [0]中的内容会被覆盖,eventho我更新了新号码的新位置。我该如何处理?

这是我到目前为止所做的:

char number[5]; // array for storing number
int j=0;        // counter
int c;          // used to read char from file.
int k=0;        // 2nd counter
char*listOfNumbers[10]; // array with all the extracted numbers.
FILE *infile; 

infile = fopen("prueba.txt", "r");

if (infile) {
    while ((c = getc(infile)) != EOF) {
        if(c != ' ' && c != '\n') 
            number[k] = c;
            ++k;
        } // end inner if
        else {
            number[k] = '\0';
            listOfNumbers[j] = number;
            printf("Element %d is: %s\n", j, listOfNumbers[j]); // prints correct value
            ++j;
            k=0;
        } // end else

    } // end while
    fclose(infile);
} // end outer if

printf("\nElement 0 is: %s\n", listOfNumbers[0]);  // fails - incorrect value
printf("Element 1 is: %s\n", listOfNumbers[1]);    // fails - incorrect value
printf("Element 2 is: %s\n", listOfNumbers[2]);    

2 个答案:

答案 0 :(得分:1)

char * listOfNumbers [10];只保留10个指向char的内存。 并且listOfNumbers [j] = number仅存储数组编号的地址。它不会复制数组编号的内容。由于数字加法器永远不会改变,因此“列表”的10个元素中的每一个都指向相同的空间。

您需要为listOfNumber的每个元素使用malloc来保留空间。你需要使用strcpy将数字的内容复制到当前的listOfNumber [k]。

listOfNumber[k] = malloc(strlen(number)+1);  // reserve space of len 
strcpy(listOfNumbers[k],number) // copy string 

不要忘记最后释放listOfNumbers的每个元素...... 并且还要注意您的文件可能包含10个以上的字符串......

答案 1 :(得分:0)

你正在做的是你拿一个五char个缓冲区,把它的地址(number衰减到char*中的listOfNumers[0] = number;并存入一个十个char*的数组。当然,这不是你想要做的,因为最终结果是listOfNumbers中的所有条目都指向同一个缓冲区并且原始内存丢失。

您有两种方法可以解决此问题:

  1. 使用strcpy()作为H2CO3的建议。

  2. 使用动态内存分配。如果你正在使用glibc,asprintfscanf的分配扩展名是你的朋友(它是POSIX 2008)。

  3. 一般来说,我总是建议不要使用固定长度的缓冲区:我可以向你保证,当你施加的限制不再符合要求的时候到了,然后你就可以进行扩展的错误搜寻方......那些分配功能真的让生活变得更轻松。