我正在尝试编写一个程序来查找文件 (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/