文本搜索(C实现)

#include <stdio.h>
#include <string.h>
using namespace std;

struct cha
{
    char aa[50];//存储单词(不重复)
    int  num;//该单词出现的次数
    int  Mark[100];//标记该单词出现过的行
};

cha CHA[1000]; 

struct Mystr
{
    char bb[50];//存储 :字符串
    int rol;//存储:字符串 所在行
};


void Standard_String(char cans[]) //标准化字符串
{
    int i=0;
    while(cans[i]!='\0')
    {
        if(cans[i]>='A'&&cans[i]<='Z')//字母全小写
            cans[i]+='a'-'A';
        else if((! ((cans[i]>='A'&&cans[i]<='Z')||(cans[i]>='a'&&cans[i]<='z')))&&cans[i]!=' ')
            cans[i]=' ';              //符号全变为空格
        ++i;
    }

    char standard[501];   //存放标准字符串
    i=0;int j=0;
    while(cans[i]==' ')//去开头空格
        ++i;
    while(cans[i]!='\0')
    {
        while(cans[i] != ' ' && cans[i]!='\0')
        {
            char ctem=cans[i];
            standard[j++]=ctem;
            ++i;
        }
        standard[j++]=' ';
        while(cans[i] == ' '&&cans[i]!='\0')
            ++i;    
    }
    standard[j]='\0';
    strcpy(cans,standard);
}



int main()
{
    char cc[500][501];  //存储 原版文本
    char Standard_File[500][501];  //存储标准化后的文本,用于查找字符串
    Mystr ans[1000];//存储字符串
    char tem[50];
    int i=0,m;





   /***************************读取文件*******************************/
    FILE* fp;
    if((fp=fopen("E:\\cc.txt","r"))==NULL) 
    {
        printf("cannot open file\n");
        return 0;
    }
    int fcount=0;//记录文本的行数
    while(!feof(fp))
    {
        i=0;
        while(!feof(fp))//100个字符为一行存入cc中
        {
            fgets(cc[fcount],500,fp);
            char ctem[501];
            strcpy(ctem,cc[fcount]);
            Standard_String(ctem);//字符串标准化
            strcpy(Standard_File[fcount++],ctem);
        }
    }
    fclose(fp);
  /***************************************************************************/








 /**************************扣取单词,统计单词个数*******************************/

    int count=0;//单词数
    for(m=0;m<fcount;m++)
    {
        i=0;
        while(cc[m][i]==' ')//去开头空格
            ++i;
        while(cc[m][i]!='\0')
        {
            ++count;
            int j=0;
            //printf("%d : ",count);
            while( ( (cc[m][i]>='a'&&cc[m][i]<='z')||(cc[m][i]>='A'&&cc[m][i]<='Z')||cc[m][i]=='\'')&&cc[m][i]!='\0')
            {
                char ctem=cc[m][i];
                if(cc[m][i]>='A'&&cc[m][i]<='Z') ctem+='a'-'A';
                printf("%c",ctem);
                ans[count].bb[j++]=ctem;
                ++i;
            }
            ans[count].bb[j]='\0';
            ans[count].rol=m;//记录每个单词所在的行号
            printf("\n");
            while( (!( (cc[m][i]>='a'&&cc[m][i]<='z')||(cc[m][i]>='A'&&cc[m][i]<='Z')||cc[m][i]=='\'' ))&&cc[m][i]!='\0' )
                 ++i;    
        }
    }
    printf("一共 %d 个单词\n",count);

/***************************************************************************/









    /****************************按照字符顺 冒泡排序*********************/
    int is=0;//是否排序完成
    int Tct=count;
    while(is==0)
    {
        is=1;
        for(i=1;i<Tct;i++)
        {
            if(strcmp(ans[i].bb,ans[i+1].bb)>0)
            {
                is=0;
                Mystr Mtem=ans[i];
                ans[i]=ans[i+1];
                ans[i+1]=Mtem;
            }
        }
        --Tct;
    }
    /*********************************************************************************/










/***************************记录单词出现的次数和所在的行号**************************/

    printf("\n");
    printf("\n");
    int count2=-1;//不同的单词的个数
    for(i=1;i<=count;i++)
    {
        if(strcmp(ans[i].bb,ans[i+1].bb)==0)
        {
            strcpy(CHA[++count2].aa,ans[i].bb);

            if(CHA[count2].Mark[ans[i].rol]!=1)//标记该单词出现过的行号
                CHA[count2].Mark[ans[i].rol]=1;
            if(CHA[count2].Mark[ans[i+1].rol]!=1)//标记该单词出现过的行号
                CHA[count2].Mark[ans[i+1].rol]=1;

            strcpy(tem,ans[i].bb);
            CHA[count2].num+=2;
            i+=2;
            while(strcmp(tem,ans[i].bb)==0)
            {
                ++CHA[count2].num;
                if(CHA[count2].Mark[ans[i].rol]!=1)//标记该单词出现过的行号
                    CHA[count2].Mark[ans[i].rol]=1;
                ++i;
            }
            --i;
        }
        else if (strcmp(ans[i].bb,ans[i+1].bb)!=0)
        {
            strcpy(CHA[++count2].aa,ans[i].bb);

            if(CHA[count2].Mark[ans[i].rol]!=1)//标记该单词出现过的行号
                CHA[count2].Mark[ans[i].rol]=1;
            CHA[count2].num++;
        }
    } 

/*********************************************************************************/





/******************************按照次数排序*************************************/

    printf("\n");
    printf("\n");
    is=0;//是否排序完成
    Tct=count2;
    while(is==0)
    {
        is=1;
        for(i=0;i<Tct;i++)
        {
            if(CHA[i].num<CHA[i+1].num)
            {
                is=0;
                cha ctem=CHA[i];
                CHA[i]=CHA[i+1];
                CHA[i+1]=ctem;
            }
        }
        --Tct;
    }
    if(count2!=0)
    {
        printf("先按次数再按字符序的排序如下:\n\n");
        for(i=0;i<=count2;i++)
            printf("第%d个: 出现次数为:%d次    %s\n",i+1,CHA[i].num,CHA[i].aa);
    }

    /*********************************************************************************/







/******************************输出 次数 频率*************************************/

    printf("\n");
    printf("\n");
    for(i=0;i<=count2;i++)
        printf("字符:%s  次数为:%d 频率:%0.3lf\n",CHA[i].aa,CHA[i].num,(double)CHA[i].num/count);
    printf("\n");
    printf("\n");
/*********************************************************************************/








/***********************************查找***************************************/


    printf("查找单词请输入‘1’,查找字符串请输入‘2’:");
    int mark1;
    while(scanf("%d",&mark1)!=EOF)
    {
        int find=0;
     /***********************查找单词************************/
        if(mark1==1) 
        {
            char word[50];
            printf("请输入要查找的单词:\n");
            scanf("%s",word);
            printf("\n");

            for(i=0;i<=count2;i++)
            {
                if(strcmp(word,CHA[i].aa)==0)
                {
                    find=1;
                    for(m=0;m<fcount;m++)
                    {
                        if(CHA[i].Mark[m]==1)
                            printf("找到第%d行:%s\n",m+1,cc[m]);
                    }

                    break;
                }
            }

            if(find==0) printf("该单词不存在!!\n");
        }
      /***************************查找字符串************************/
        else
        {
            char word2[50];
            printf("请输入要查找的字符串:\n");
            getchar();
            gets(word2);
            Standard_String(word2);//字符串标准化
            int len2 = strlen(word2);
            printf("\n");
            for(m=0;m<fcount;m++)
            {
                int len1=strlen(Standard_File[m]);

                if(len1<len2) continue;

                for(i=0;i+len2<=len1;i++)
                {
                    while((i+len2<=len1)&&word2[0]!=Standard_File[m][i])
                        ++i;

                    if(i+len2>len1) continue;

                    char ctem[50];
                    strncpy(ctem,Standard_File[m]+i,len2);
                    ctem[len2]='\0';
                    if(strcmp(ctem,word2)==0)
                    {
                        printf("找到第%d行:%s\n",m+1,cc[m]);
                        break;
                    }
                }
            }
        }
        printf("\n查找单词请输入‘1’,查找字符串请输入‘2’:");
    }

 /*********************************************************************************/

    return 1;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券