我需要编写一个代码来打印给定文件中每个单词的频率。像“the”和“The”这样的单词将被视为两个不同的单词。到目前为止,我已经编写了一些代码,但是当我尝试运行程序时,命令提示符停止工作。我只是需要一些指导,并指出这个代码的最佳方向,或者我想被告知这个代码需要被放弃。我不是很擅长这一点,所以任何帮助都会非常感激。
#include <stdio.h>
#include <string.h>
#define FILE_NAME "input.txt"
struct word {
char wordy[2000];
int frequency;
} words;
int word_freq(const char *text, struct word words[]);
int main (void)
{
char *text;
FILE *fp = fopen(FILE_NAME, "r");
fread(text, sizeof(text[0]), sizeof(text) / sizeof(text[0]), fp);
struct word words[2000];
int nword;
int i;
nword = word_freq(text, words);
puts("\nWord frequency:");
for(i = 0; i < nword; i++)
printf(" %s: %d\n", words[i].wordy, words[i].frequency);
return 0;
}
int word_freq(const char *text, struct word words[])
{
char punctuation[] =" .,;:!?'\"";
char *tempstr;
char *pword;
int nword;
int i;
nword = 0;
strcpy(tempstr, text);
while (pword != NULL) {
for(i = 0; i < nword; i++) {
if (strcmp(pword, words[i].wordy) == 0)
break;
}
if (i < nword)
words[i].frequency++;
else {
strcpy(words[nword].wordy, pword);
words[nword].frequency= 1;
nword++;
}
pword = strtok(NULL, punctuation);
}
return nword;
}
答案 0 :(得分:1)
首先关闭所有:
char *text;
FILE *fp = fopen(FILE_NAME, "r");
fread(text, sizeof(text[0]), sizeof(text) / sizeof(text[0]), fp);
读取文件的4个字节,因为sizeof(text[0])
为1而sizeof(text)
可能为4(取决于指针大小)。您需要使用ftell()
或其他方法来获取数据文件的实际大小,以便将其全部读入内存。
接下来,您将此信息存储到没有分配内存的指针中。 text
需要使用malloc或以某种方式保存内存。这可能是导致程序无法工作的原因,只是为了开始。
还有许多其他问题,需要时间来解释它们:
tempstr
NULL
个终止的字符串,它可能也是如此,所以也许这是可以的。nwords[i].wordy
,即使它未初始化,因此也是垃圾。pword
,它是为你的循环计数器整体化的。请提供帮助或向您的老师询问此问题,因为此代码严重损坏。