body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;}

1、先去除文件标点符号并且把大写改成小写。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 30
typedef struct node
{
        char s[30];
        struct node* next;
        int count;
}node,*List;
int FindInDict(node **dict,char *s);
//int FindInDict(List dict,char *s);
void InsertToDict(node **dict,char *s);
//void InsertToDict(List dict,char *s);
void FindTop(node *dict,List top[],int n);
int main(int argc,char **argv)
{
        FILE *fp=fopen(argv[1],"r");
        char ch;
        char word[30];
        int len=0;
        int c_ch=0,c_line=0,c_word=0;
        node *dict =(node *)calloc(26,sizeof(node));       //定义动态数组,存放的是相应单词的头结点
        node *top[10]={0};         //存放排名前十的单词的指针(内存地址)
        int i=0;
        fseek(fp,0,SEEK_SET);
        if(fp!=NULL)
        {
                while((ch=fgetc(fp))!=EOF)  
    //注意这里必须(ch=fgetc(fp)),因为!=优先级高,先算!=结果为1,不加()结果ch=1
                {
                        c_ch++;
                        len=0;
                        while(ch>='a'&&ch<='z')
                        {
                                word[len++]=ch;
                                ch=fgetc(fp);
                                c_ch++;
                        }
                        if(len!=0)
                        {
                                word[len]='\0';
                                c_word++;
                                if(FindInDict(&dict,word)==0)
//if(FindInDict(dict,word)==0)
                                        InsertToDict(&dict,word);
// InsertToDict(dict,word);
                        }
                        if(ch=='\n')
                                c_line++;
                }
                printf("the number of character is:%d\n", c_ch);
                printf("the number of line is:%d\n", c_line + 1);
                printf("the number of word is:%d\n", c_word);
                FindTop(dict,top,10);
                for(i=0;i!=10;++i)
                        printf("the top %2d word is %-10s, %d\n", i + 1, top[i]->s, top[i]->count);
        }
        else
                perror("fopen:The_Holy_Bible_Res.txt");
        system("pause");
        return 0;
}
int FindInDict(node **dict,char *s)
{
        int index=(s[0]-'a');
        node *p=((*dict)+index)->next;
        while(p!=NULL)
        {
                if(strcmp((p->s),s)<0)
                        p=p->next;
                else if(strcmp(p->s,s)>0)
                        return 0;
                else
                {
                        p->count++;
                        return 1;
                }
        }
        return 0;
}

void InsertToDict(List *dict,char *s)
{
        int index=(s[0]-'a');
        node *p=(*dict+index)->next;
        node *word=(node *)malloc(sizeof(node));
        word->count=1;
        strcpy(word->s,s);
        word->next=NULL;
        if(NULL==p)
        {
                (*dict+index)->next=word;
        }
        else
        {
                if(strcmp(s,p->s)<0)
                {
                        word->next=p;
                        (*dict+index)->next=word;
                        return;
                }
                while(p->next!=NULL)
                {
                        if(strcmp(s,p->next->s)<0)
                        {
                                word->next=p->next;
                                p->next=word;
                                return;
                        }
                        else
                                p=p->next;
                }
                if(p->next!=word)
                        p->next=word;
        }
}
int cmp(const void *a,const void *b)          //List数组中任意两个元素的地址
{
        List *i=(List*)a;        //强制转换
        List *j=(List*)b;
        return ((*j)->count-(*i)->count);
}
void FindTop(List dict,List top[],int n)
{
        node *p=dict;
        node *q=p->next;
        node *tmp[100000]={0};
        int i,index=0;
        while(p<dict+26)
        {
                while(q!=NULL)
                {
                        tmp[index++]=q;
                        q=q->next;
                }
                p++;
                q=p->next;
        }
        qsort(tmp,index,sizeof(List),cmp);
        for(i=0;i<n;++i)
                top[i]=tmp[i];
}

去除标点符号只要一个一个字符读,判断是标点符号就用空格代替;一个一个字符读是因为一行一行的读或者一个数组一个数组的读虽然能提高效率;但是有可能一个单词只读了一半在数组里数组就读满了,或者有些单词一行末尾没写完又转接写到下一行

c语言统计一个文件中的单词,字符和行数的更多相关文章

  1. MySQL数据库中统计一个库中的所有表的行数?

    今天公司两个远端的数据库主从同步有点问题,查看下wordpress库下所有表的表的条目? mysql> use information_schema;Database changedmysql& ...

  2. 统计一个文件中出现字符'a'的次数

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #统计一个文件中出现字符'a'的次数 #http://www.cnblogs.com/hongten/p/ho ...

  3. HashMap 统计一个字符串中每个单词出现的次数

    HashMap 统计一个字符串中每个单词出现的次数 import java.util.HashMap; import java.util.Map; public class Test { public ...

  4. js 统计一个字符串中出现的字符最多的字符

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. C语言统计一个字符串中单词的个数

    假定每一个单词用空格隔开. 样例: 输入:how are you! 输出:3 两种方法: 一: #include <stdio.h> #include <string.h> # ...

  6. Linux:从文件中搜索关键字并显示行数(cat,grep函数)

    假如有test1.txt的格式如下图所示: 有test2.txt的内容如下: 现需将test2.txt含有的关键字的行搜索出来并显示行数 则可以用到命令: cat test1.txt | grep - ...

  7. 在Windows下通过命令行或者.bat文件统计一个目录中文件数量

    在Windows下面怎样通过命令行统计一个目录中文件的数量,或者说,如果在一个.bat文件中,统计一个目录中的文件数量? 我原来以为是不可能的,要编一个vbs程序什么的,后来到网上找了下,发现还真是可 ...

  8. java算法面试题:编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。

    package com.swift; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...

  9. shell统计一个文件里某行出现的次数并排序

    话说有个aaa.txt文件,文件内容如下: aaaabbbbccccddddeeeeffffmmmmooooaaaaccccaaaabbbbddddaaaammmmbbbbaaaaoooo 然后面试题 ...

随机推荐

  1. 微信小程序开发之详解生命周期方法

    生命周期是指一个小程序从创建到销毁的一系列过程 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面 先来看一张小程序项目结构 从上图可以看出,根目录下面有包含了app.js ...

  2. ssh整合开发

    ssh整合思想 ssh整合 第一步:导入ssh相关jar包 第二步:搭建struts环境   (1)创建 action  struts.xml配置文件, 配置action struts.xml约束 & ...

  3. [UWP]如何使用Fluent Design System (上)

    1. 前言 微软在Build 2017中公布了新的设计语言Fluent Design System(以下简称FDS),不过官网只是堆砌了各种华丽的词语以及一堆动画.至于在UWP中要做成怎么样,怎么做, ...

  4. Proof of Elapsed Time--Hyperledger Sawtooth 共识算法

    这一片文章中我们介绍一下Hyperledger Sawtooth项目中所提出的PoET共识算法, 现有的区块链共识算法大概可以分为两种: Nakamoto consensus:通过乐透的方式选择出一个 ...

  5. [转载]github在线更改mysql表结构工具gh-ost

    GitHub正式宣布以开源的方式发布gh-ost:GitHub的MySQL无触发器在线更改表定义工具! gh-ost是GitHub最近几个月开发出来的,目的是解决一个经常碰到的问题:不断变化的产品需求 ...

  6. C#学习笔记-备忘录模式

    什么是备忘录模式? 备忘录模式(Memento):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式的组成   Orig ...

  7. java_web学习(十一) 层的概念与应用

    一个项目通常分为三层: 所谓三层是表述层(WEB层).业务逻辑层(Business Logic),以及数据访问层(Data Access). ·WEB层:包含JSP和Servlet等与WEB相关的内容 ...

  8. 学习笔记-express路径问题

    在页面渲染成功之后,报错出现静态文件css样式引用路径出错,于是我就根据express api文档,托管静态文件作出修改,最后全是徒劳.于是我又从引用开始找起,<link rel="s ...

  9. NOI2017&&codeM2017游记

    7.17 坐了一天动车到绍兴,宿舍环境什么的还是很棒的. 7.18 早上开幕式,没啥好看的,例行节目+讲话. 下午笔试,顺利满分,不过ccz挂了一道多选,99分,影响应该不是很大. 练习赛出人意料地没 ...

  10. 解决在SecurecCRT登录后,发现方向键、backspace(退格键)、delete(删除键)为乱码的问题

    问题:使用securecrt ssh到linux之后,backspace(退格键),delete(删除键),以及4个方向键都为乱码,不能正常使用.按tab键也没有自动补全文件名. 即: 按Backsp ...