gpt4 book ai didi

c - 数组被覆盖时遇到问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:28:39 25 4
gpt4 key购买 nike

我试图将一个拼字游戏字典加载到内存中,但是当我打印出字典的内容时,它似乎已经用 buf 看到的最后一个字符串重写了我的数据数组中的每个字符串,例如,当我在最后打印出数据数组,数组中的每个条目都是“zzz”,因为它是 scrabble.txt 中的最后一个条目。我不明白为什么它被覆盖了?我做错了什么?

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

#define LEN 100

struct data_t {
int nval; /* current number of values in array */
int max; /* allocated number of values */
char **data; /* the data array */
};

enum {INIT = 1, GROW = 2};

int main(void)
{
FILE *fp = fopen("scrabble.txt", "r");
char buf[LEN];
int i = 0;
struct data_t *data = malloc(sizeof(struct data_t));
data->nval = INIT;
data->max = INIT;
data->data = NULL;
while (fgets(buf, LEN, fp)) {
if (data->data == NULL) {
data->data = malloc(LEN);
assert(data->data);
}
else if (data->nval > data->max) {
data->data = realloc(data->data, GROW * data->max * LEN);
assert(data->data);
data->max = GROW * data->max;
}
//printf("%s\n",buf);
data->data[i] = buf;
//printf("data->data[%d] = %s ", i, data->data[i]);
i++;
data->nval++;
}
/* overcounted */
data->nval--;

for(i = 0; i < data->nval; i++)
printf("data->data[%d] = %s", i, data->data[i]);

fclose(fp);
free(data->data);
return 0;
}

最佳答案

你写:

data->data[i] = buf;

这使得指针data->data[i] 指向缓冲区buf。每次在循环中都这样做,所以最终所有指针都指向 buf。因此,当您输出每个指针指向的内容时,它会多次输出 buf 的内容。

您可能想为每一行使用不同的缓冲区。您将不得不使用 malloc 或相关的方法来分配这些缓冲区。例如,将 data->data[i] = buf; 替换为:

data->data[i] = strdup(buf);

(strdup 不是标准 C 函数,但如果您的系统没有它,您可以 malloc(strlen(buf)+1) 后跟 strcpy).

关于c - 数组被覆盖时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29335910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com