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. Java 读取配置文件

    1.读取XML文件使用dom4j-full.jar包的SAXReader解析: Document document=new SAXReader.reader("xml文路径/文件名xxx.x ...

  2. 【转】Install libimobiledevice on Mac OSX

    About the App App name: libimobiledevice App description: Library to communicate with iOS devices na ...

  3. Oracle 序列 CACHE 值必须小于 CYCLE 值的解决方法

    之前创建sequence时碰到一个问题, 当我使用了cache时总是提示CACHE 值必须小于 CYCLE 值,查了下文档,找到这么一个公式 文档的大概意思是cache的值必须要小于通过这个公式计算得 ...

  4. 【zkw费用流】[网络流24题]餐巾计划问题

    题目描述 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分(f ...

  5. sql server 删除大量数据的一次坑爹之旅

    数据库有1kw数据不在使用了,影响读写速度,于是要删除掉 使用delete语句 意外发生,持续了半个小时后,依然不见结束的迹象 于是强行结束(停止了服务) 再打开服务后,数据库显示 [正在恢复] 百度 ...

  6. Erlang内存吃紧之解决思路

    首先使用erlang:memory()确定是哪个部分内存吃紧,根据输出的内容,比对内存占用大小,有针对性地进行分析.在erlang系统里内存的单位为word,通过erlang:system_info( ...

  7. Spring Boot项目构建

    环境准备 IDEA+JDK 1.8+Maven+mysql+SSM 1.使用Spring Boot框架可以大大加速Web应用的开发过程,首先在Maven项目依赖中引入spring-boot-start ...

  8. python制作wifi破解(跑字典(单线程))

    很鸡巴简单,接上一篇文章 import pywifi import sys import time from pywifi import const def test_wifi_connect(pas ...

  9. border-image详解

    一.border-image的兼容性 border-image可以说是CSS3中的一员大将,将来一定会大放光彩,其应用潜力真的是非常的惊人.可惜目前支持的浏览器有限,仅Firefox3.5,chrom ...

  10. bzoj:3392: [Usaco2005 Feb]Part Acquisition 交易

    Description     奶牛们接到了寻找一种新型挤奶机的任务,为此它们准备依次经过N(1≤N≤50000)颗行星,在行星上进行交易.为了方便,奶牛们已经给可能出现的K(1≤K≤1000)种货物 ...