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. rpc之thrift

    rpc之thrift 一.介绍 thrift是一个rpc(remove procedure call)框架,可以实现不同的语言(java.c++.js.python.ruby.c#等)之间的相互调用. ...

  2. Java使用RSA加密算法对内容进行加密

    什么是RSA加密算法 RSA是一种典型的非对称性加密算法,具体介绍可参考阮一峰的日志 RSA算法原理 下面是使用RSA算法对传输内容进行加密的一个简要Java案例,主要用到了三个类,大体实现如下: 对 ...

  3. 机器学习笔记3-Tensorflow简介

    前言 前面两篇主要写了一些机器学习的基础概念,从本篇开始我们来了解下深度学习.深度学习是机器学习的一个子集,是一种特殊的数学模型.同样是从输入到输出,深度学习在这两者之间会有很多层称为"隐层 ...

  4. 某xss挑战赛闯关笔记

    0x0 前言 在sec-news发现先知上师傅monika发了一个xss挑战赛的闯关wp([巨人肩膀上的矮子]XSS挑战之旅---游戏通关攻略(更新至18关)https://xianzhi.aliyu ...

  5. 大数据分析中Redis怎么做到220万ops

    大数据时代,海量数据分析就像吃饭一样,成为了我们每天的工作.为了更好的为公司提供运营决策,各种抖机灵甚至异想天开的想法都会紧跟着接踵而来!业务多变,决定了必须每天修改系统,重新跑数据,这就要求极高的海 ...

  6. Django-常用模板标签及过滤器

    常用模板标签及过滤器 标签和过滤器完整介绍 https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 模板的组成 HTML代码+ 逻 ...

  7. WebService服务(转)

    一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...

  8. windows c++程序移植到linux的要点

    这段时间得到一份源码,是Windows下的,调试了一把,可以正常运行,可是没有Linux版本,而实际的应用场景是要在Linux服务器上面运行 所以涉及到Windows下c++程序的移植,有同事竭力推荐 ...

  9. 新浪新闻页面抓取(JAVA-Jsoup)

    1.使用gradle建立工程: 工程格式如下: include ':spider-demo' rootProject.name = 'my-spider-demo' settings def void ...

  10. 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现

    应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关 ...