C语言 统计文本文件中词语个数

贾继康
博客专家认证
2019-03-02 02:06:33
如下图所示:


...全文
291 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
贾继康 2019-03-04
  • 打赏
  • 举报
回复
不好意思呀大哥,那小弟重新来一次吧: 1:原始文本如下所示: 2:统计文本中出现非重复的词的个数,以及按照出现重复词的数量(从大到小)排序:结果如下所示: 3:我的代码时间空间复杂度都太高了,对于我的100多万行的文本根本不行。所以还要麻烦大哥帮小弟能写一个嘛
@风轻云淡_ 2019-03-04
  • 打赏
  • 举报
回复
一定要用C语言吗,用C++的话应该简单多了
@风轻云淡_ 2019-03-04
  • 打赏
  • 举报
回复
你可以参考网上的代码,用C实现一个hashmap结构,或者直接用C++里的Map。
思路就是map<string,int> 读取文本,一次读一行往里插(如果用getline的话,小心\r),读取到的词语作为key,每一个key的value都初始化为0,插入成功,下一条。插入失败(重复),使用index功能,取出该key的value,然后加一。循环往复就好了,并且map有自动排序功能,很方便。
顺便测测 map 的性能
贾继康 2019-03-04
  • 打赏
  • 举报
回复
可以用C++大哥,,,,只是小弟不会大哥,,大哥分享的那个链接,不符合我的要求呀 以下是我写的大哥: #include <stdio.h> #include <string.h> struct words //单词结构体 { char word[115]; int count; }; int main(int argc, char *argv[]) { struct words word[12000] = {0}, stmp = {0}; int i = 0, j = 0, k = 0, flag = 0; int wors = 0; char c; char tmp[100] = {0}; // 存储每个词语,最多存储50个字 FILE *fp = NULL; fp = fopen(argv[1], "r"); //读文件解析词语 while ((c = fgetc(fp)) != EOF) // 按字符读取 { //以换行符作为单词标识符。 if (c != '\n') { tmp[j++] = c; // 在未遇到词语标识符之前将 } else { //tmp[j] = '\0'; // 清零操作 j = 0; // 重置 flag = 0; //判断单词是否已经记录 如果已有则使用率加1 for (k = 0; k < i; k++) { if (strcmp(tmp, word[k].word) == 0) // 判断相等函数 { word[k].count++; // 统计相同的词语的个数 flag = 1; // 设置标识符为1 break; } } //没有则存入单词结构体数组保存 if (!flag) { strcpy(word[i].word, tmp); word[i].count++; i++; } memset(tmp, 0, sizeof(tmp)); memset(tmp, '\0', sizeof(tmp)); } } fclose(fp); //使用冒泡排序实现降序排序 for (j = 0; j < i; j++) { for (k = 0; k < i - j - 1; k++) { if (word[k].count < word[k + 1].count) //判断词语出现的次数大小 { stmp = word[k]; word[k] = word[k + 1]; word[k + 1] = stmp; } } } // 输出排序后的所有已记录单词 // 排序之后实现打印输出 for (k = 0; k < i; k++) { printf("[%s][%d]\n", word[k].word, word[k].count); } } 这是小弟写的,,但是我用100w行数据测试的时候(每行定都20个字以内),
636f6c696e 2019-03-02
  • 打赏
  • 举报
回复
这年头找个会表述清楚问题的人就那么难么

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧