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. ssh的免密登陆

    想必大家都有使用ssh登陆的过程了,那么,怎么设置ssh免密登陆呢?下面有一些我的总结: 环境:服务器主.从 主服务器:192.168.1.1 从服务器:192.168.1.2 实现主服务器ssh登录 ...

  2. 第十章:Python の 网络编程基础(二)

    本課主題 Python中的作用域补充 socketserver 源码 线程的介绍和操作实战 进程的介绍和操作实战 协程的介绍和操作实战 本周作业 Python中的作用域补充 Python世界里沒有块级 ...

  3. Elasticsearch Head插件实践

    简介 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Ap ...

  4. [转载]mysql中实现行号,oracle中的rowid

    mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用 ...

  5. Linux磁盘分区/格式化/挂载(树莓派3挂载硬盘)

    [前言] 本文将要讲解的功能为Linux环境下对磁盘进行操作.包括分区.格式化.挂载外接移动存储设备等. 该文的写作背景为本人的树莓派需要外接一个固态硬盘作为存储设备,因此,便开始了一系列的折腾. [ ...

  6. python 单下划线/双下划线使用总结

    文章转自:http://blog.csdn.net/pfm685757/article/details/45918575

  7. Swagger的简单入门【转载】

    一.Swagger简介 上一篇文章中我们介绍了Spring Boot对Restful的支持,这篇文章我们继续讨论这个话题,不过,我们这里不再讨论Restful API如何实现,而是讨论Restful ...

  8. js分享功能

    引用JiaThis的分享功能: 直接在想要放置分享功能的地方加上如下代码即可: <!-- JiaThis Button BEGIN --> <div class="jiat ...

  9. printf不能直接输出string类型

    因为string不是c语言的内置数据,所以直接printf输出string类型的是办不到的.要这样输出: printf("%s\n",a.c_str()); 举例: #includ ...

  10. JAVA实现网页上传头像

    大概实现就是在页面嵌入一个file类型的input控件,并且将之隐藏,点击上传传递到这个控件上面,选择文件,将图片以base64的方式传递到后台,后台解码器解码,保存图片,并且把图片名字保存到数据库或 ...