如何徒手搓出一个命令行版的成语词典

发布时间:2024年01月14日

极度无聊,写点代码.

于是整了个成语词典.从网上搜索了个成语典库,手动修正了格式,方便从fscanf中读取.

本来想使用三个%s直接读取,看来我想得太简单了,里面有空格不行,于是想到fscanf有正则表达式方法,于是展开的无敌的网络搜索,终于整了个表达式

? ? ? ? ? ?

st=fscanf(fp,"%s%*[^\[]\[%[^\]]\]%*[^#]#%[^\n]",s1,s2,s3);
//使用正则表达式提取字符串? 
//沐雨经霜 [mù yǔ jīng shuāng] #指承受雨淋霜打.形容历尽辛苦.出处:无示例:无
//s1 通过第一个%s提取
//s2 通过%*[^\[]\[%[^\]]\]提取,表达式分解为这部分%*[^\[]和\[和%[^\]]和\],加反斜杠为了转义,表示跳过[部分,提取中括号里的内容
//s3 通过%*[^#]#%[^\n]提取,表示跳过#提取换行符之间的内容

初始化字典存入一个向量中

bool init_dict(vector <INFO> &dc)
{
    FILE *fp=NULL;
    fp=fopen("utf8_words.txt","r");

    if(fp) {
        int st=0;
        do {
            char s1[100],s2[500],s3[1024];
            //使用正则表达式提取字符串
            //沐雨经霜 [mù yǔ jīng shuāng] #指承受雨淋霜打.形容历尽辛苦.出处:无示例:无
            //s1 通过第一个%s提取
            //s2 通过%*[^\[]\[%[^\]]\]提取,表达式分解为这部分%*[^\[]和\[和%[^\]]和\],加反斜杠为了转义,表示跳过[部分,提取中括号里的内容
            //s3 通过%*[^#]#%[^\n]提取,表示跳过#提取换行符之间的内容
            st=fscanf(fp,"%s%*[^\[]\[%[^\]]\]%*[^#]#%[^\n]",s1,s2,s3);
            //printf("st=%d\n",st);
            if(st==3) {
                //printf("s1:%s,s2:%s,s3:%s\n",s1,s2,s3);
                INFO item;
                item.idiom=s1;
                item.pinyin=s2;
                item.detail=s3;
                dc.push_back(item);
            }
        } while(st==3);
        fclose(fp);
        return !dc.empty();
    }
    return false;
}

通过简易遍历查找字典

    vector<int> v;
    if(find_hziv(dict,srh,v)) {
        size_t sz=v.size();
        for(uint32_t i=0; i<sz; i++) {
            printf("[%s,%d/%d]:%s %s\n     %s\n\n\n",sf.c_str(),i+1,sz,dict[v[i]].idiom.c_str(), dict[v[i]]. pinyin.c_str(), dict[v[i]].detail.c_str());
        }
    }else{
        printf("not found\n");
	}

简单成语接龙

//成语接龙
    int istart=0,idx=0;
    string t4;
    int cr=0;
    vector <int> list;
    while(find_hz1(dict,istart,sf,idx,t4)) {
        bool same=false;
        for(size_t e=0; e<list.size(); e++) {
            if(list[e]==idx) {
                same=true;
                istart=idx+1;
            }
        }
        if(!same) {
            cr++;
            list.push_back(idx);
            if(cr>4) {
                cr=0;
                putchar('\n');
            }
            sf=t4;
        }
    }

由于WIN32命令行是GBK所以进入命令行要代码页和转入内容转化为UTF8,才能正常显示汉字

        system("chcp 65001"); 
        string sf=cvt_gbk_to_utf8(p[1]);

运行程序格式

idict 成语或部分关键字?

idict?单字?

idict?单字 (1开始的序号)

编译方式g++ idict.cpp -oidict

下载代码链接:https://pan.baidu.com/s/1daU8XXXQ5m8epGJ6ZOgMjw?pwd=tptk?
?

文章来源:https://blog.csdn.net/wisepragma/article/details/135585896
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。