c - 动态分配的指针数组不断重写自身

标签 c string pointers structure

我正在尝试编写一个程序来查找文件 (words.txt) 中单词的频率,使用动态分配的指针数组来存储单词和 单词出现的频率并将结果打印到另一个文件 (frequencies.txt)。

例子:

从words.txt读取

apple
orange
apple
banana
orange
apple

写入频率.txt:

3 apple
2 orange
1 banana

这是程序

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

struct wordfreq 
{
  int count;
  char *word;
};

typedef struct wordfreq wordfreq;

int main(int argc, char *argv[])
{
    wordfreq **wordarray;
    int size = 1, i, j, x, compare;
    char buffer[100];
    FILE *fp;

    if ( argc != 3 )
    {
        fprintf(stderr,"!!!ERROR!!!\nNUMBER OF MISSING PARAMETERS: %d\n", 3-argc);
        exit(-1);
    }

    fp = fopen(argv[1],"r");
    if ( fp == NULL )
    {
        perror(argv[1]);
        exit(-1);
    }

    wordarray = (wordfreq**)malloc(size*sizeof(wordfreq*));

    for(i = 0; i < size; i++)
    {
        wordarray[i] = (wordfreq *) malloc(sizeof(wordfreq*));
        wordarray[i]->word = "!";
        wordarray[i]->count = 0;
    }

    while(fscanf(fp,"%s",buffer) == 1)
    {
        printf("Word: %s\n", buffer);

        if(wordarray[0]->word == "!")
        {
            wordarray[0]->word = buffer;
            wordarray[0]->count = 1;
        }

        //Continued coding

        for(x = 0; x < size; x++)
        {
            printf("%d %s\n", wordarray[x]->count, wordarray[x]->word);
        }
        printf("\n");
    }

    //wordarray = realloc(wordarray,size*sizeof(wordfreq*));

    fclose(fp);

    fp = fopen(argv[2], "w");
    if ( fp == NULL )
    {
        perror(argv[1]);
        exit(-1);
    }

    for(i = 0; i < size; i++)
    {
        fprintf(fp, "%d %s\n", wordarray[i]->count, wordarray[i]->word);
    }

    fclose(fp);

    free(wordarray);

    return 0;
}

现在我只是尝试获取分配的第一个值(1 个苹果)。我遇到的问题是,当我尝试分配动态数组的第一个值时,wordarray->word 的值会随着每次从文件中读取而改变,但它应该保持为 apple:

Word: apple
1 apple

Word: orange
1 orange

Word: apple
1 apple

Word: banana
1 banana

Word: orange
1 orange

Word: apple
1 apple

Results:
1 apple

如有任何建议,我们将不胜感激。

最佳答案

wordarray[0]->word = buffer 替换为 wordarray[0]->word = strdup(buffer)

当前 wordarray[0]->word 是一个指向 buffer 的指针,所以每次你运行 fscanf(fp,"%s",buffer ) 你改变它的值(value)

** 不要忘记在最后释放 strdup 内存

for(i = 0; i < size; i++)
{
    free(wordarray[i]->word);
}

关于c - 动态分配的指针数组不断重写自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29726504/

相关文章:

java - ArrayList 初始容量和 IndexOutOfBoundsException

c++ - 为什么 sizeof(*node) 给出结构的大小而不是指针的大小

要传递给 C 函数的 Objective-C 选择器指针

c - 我无法打印链接列表

c - 当数据类型和返回类型从 int 更改为 float 或 double 时,行列式函数中出现段错误

c# - 两个相同的字符串可以是 C# 中的两个独立实例吗?

php - 检查字符串输入是复数还是单数?

c++ - boost::shared_ptr 问题。为什么这行得通?

c - %255[^\0]s 和 %255c 之间的区别

c - 数组验证 - 不使用辅助数组