gpt4 book ai didi

c - 将文件中的字符串存储到动态分配的数组中

转载 作者:行者123 更新时间:2023-11-30 20:18:21 26 4
gpt4 key购买 nike

我正在从文件中读取单词,确切的数字为 2243。我试图将它们存储在数组中,以便稍后在程序中读取它们。代码在函数内部。该文件没有句子,只有单词一个接一个。

char** fill_word_array(char* filename){
int i = 0, j = 0;
int lines = 0;

char str[20];
char *array[i][j];

array[i][j] = malloc(lines * sizeof(char*));


FILE * fp = fopen("words.txt", "r");
if (fp == NULL)
{
printf("Cannot open file");
return 0;
}

while (fscanf(fp, "%s", str) != EOF)
{
lines++;
}
printf("%d\n", lines);

fseek(fp, 0, SEEK_SET);

array[i][j] = malloc(sizeof(char*) * lines);
for(i = 0; i <= lines; i++)
{
strcpy(array[lines][j], str);
printf("%s", array[i][j]);
}

return 0;
}

此代码仅打印文件的最后一个单词,如下所示 http://tinypic.com/r/2zhjmgx/9 .

最佳答案

char *array[i][j] 这样带有 i==0j==0 的声明将保留一个数组大小为 0,因此即使位置 array[0][0] 也无法合法访问(未定义的行为)。因此,当您编写 array[i][j] = malloc(lines * sizeof(char*)) 时,您已经写入 array[0][0] 并产生 UB 。

通常,一个人会因为向寻求帮助的人提供解决方案而受到社区的惩罚,从而使他有机会自己创造体验。然而,对于您的成熟度水平,在我看来,这个练习太难了,因此我将按照您的方法提供一个解决方案,并描述需要考虑的事情。

希望有帮助。

根据您的方法,您需要...

  1. 数一下单词
  2. 为“words * sizeof(char*)”分配空间 +一个单词在末尾存储一个 NULL 指针(否则用户你的结果将不知道在哪里停止)。
  3. 倒回并循环阅读每个单词;
  4. 在循环中,复制临时单词内容并将其存储在数组中
  5. 在循环之后写入最终的 NULL 指针。
  6. 返回数组(并告诉用户他稍后必须释放内存)

代码如下:

char** fill_word_array(char* filename){

int words = 0;
char str[100];
char **array;

FILE * fp = fopen("words.txt", "r");
if (fp == NULL)
{
printf("Cannot open file");
return 0;
}

while (fscanf(fp, "%s", str) != EOF)
{
words++;
}
printf("%d\n", words);

fseek(fp, 0, SEEK_SET);

array = malloc(sizeof(char*) * (words+1));
for(int i = 0; i < words && fscanf(fp, "%s", str) != EOF; i++)
{
array[i] = strdup(str);
}
array[words] = NULL;

return array;
}

int main() {

char **array = fill_word_array("someFile.txt");
for (int i=0; array[i] != NULL; i++) {
printf("%s\n", array[i]);
free(array[i]);
}
free(array);
}

关于c - 将文件中的字符串存储到动态分配的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982118/

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