我需要编写读取文本文件的代码,并输出单词的数量,不同单词的数量以及C中最常用的单词 .
我已经完成了输出单词数量的代码,但我不知道如何找到不同单词的数量或最常用的单词 . 我知道我应该使用strcmp,但我不知道这样做 . 任何帮助将不胜感激 . 这是我到目前为止所拥有的 .
int main(int argc, char *argv[])
{
int number=0;
char temp[25000][50];
char word[25000][50];
char *word2[25000][50];
int wordCount=0;
int distinctCount=0;
FILE *fp;
//reads file!
fp = fopen("COEN12_LAB1.txt", "r");
if(fp == NULL)
{
printf("File Missing!\n");
return 0;
}
//counts words in file!
while(fscanf(fp,"%s", word) == 1)
wordCount++;
printf("Total number of words: %d\n", wordCount);
fclose(fp);`
}
4 回答
我为你写了一个程序,请看这里的来源:http://olegh.cc.st/src/words.c.txt当然,没有检查特殊情况,比如单行上的多个单词,单词数量> 16,000等等 . 但是,基本代码你可以得到:
运行示例:
[EDIT]
1.用calloc替换malloc(将内存初始化为0)
2.在qsort中替换了第二个参数
3.程序现在适用于更广泛的文件(更多单词,更多分隔符)
这不是很好,可能需要一些小的调试,但它会让你开始计数,不同和最常用的单词的数量:
首先,您可能需要实现允许您有效保留不同单词的结构 . Hash table是可能的一个(也许是最好的) .
以下是C上哈希的实现和使用示例:
http://troydhanson.github.io/uthash/index.html
http://elliottback.com/wp/hashmap-implementation-in-c/
你也可以看一下这个问题:Porting std::map to C?
您可以使用简单的数据库来计算输入文本中的不同字数 . 为简单起见,我建议使用SQLite . 下面我添加了一些示例代码(为了简洁起见,我省略了错误处理) .
为了阅读单词,我采用了一种方法,使用
fgets
将一行读入缓冲区 . 我注意到这种方法可以很好地工作,只要你能保证缓冲区总是足够大以容纳输入文件中的实际行 . 否则,在缓冲区的末尾会分割出单词,需要以某种方式处理 .为了解析我使用过
strtok
的文本 . 在实施过程中,我了解到很难让单词分隔符正确 . 除此之外,这种方法完全忽略了可能的拼写差异(例如,大写)和其他相同词语的inflections,因此可能对结果产生负面影响 .一旦数据在数据库中,查询语言非常适合于制定查询以获得最大(不同)字数或字频率 . 因此,当您想要从输入文本计算多个统计信息时,我认为这种灵活的方法具有优势,因为您不必在C中实现每个特殊情况 . 为了进行测试,我将part of the Wikipedia article on SQLite复制到文件
words.txt
中 .这是一个例子:
这是我的输出:
以供参考:
http://en.cppreference.com/w/c/io/fgets
http://en.cppreference.com/w/c/string/byte/strtok
http://en.cppreference.com/w/c/io/fprintf
http://www.sqlite.org/inmemorydb.html
http://sqlite.org/c3ref/open.html
http://sqlite.org/c3ref/exec.html
http://sqlite.org/lang_createtable.html
http://sqlite.org/lang_insert.html
http://sqlite.org/lang_select.html
http://sqlite.org/lang_aggfunc.html