1

我知道我可以这样初始化一个字符串数组:

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] 中的内容会被覆盖,即使我更新了新号码的新位置。我该如何处理?

这是我到目前为止所拥有的:

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]);    
4

2 回答 2

1

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

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

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

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

于 2013-08-31T21:58:07.170 回答
0

你正在做的是你取一个 5 chars 的缓冲区,取它的地址(number衰减到 a char*in )并将其存储在一个 10 slistOfNumers[0] = number;的数组中。char*当然,这不是您想要做的,因为最终结果是所有条目都listOfNumbers指向同一个缓冲区并且原始内存丢失了。

你有两种方法来解决这个问题:

  1. strcpy()按照 H2CO3 的建议使用。

  2. 使用动态内存分配。如果您使用的是 glibc,asprintf并且分配扩展名scanf是您的朋友(它是 POSIX 2008)。

一般来说,我总是建议不要使用固定长度的缓冲区:我可以向你保证,你施加的限制不再符合要求的时候会到来,然后你会参加扩展的 bug 搜寻派对......以及那些分配功能真的让生活轻松了很多。

于 2013-08-31T21:53:48.177 回答