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

本文描述了一位程序员如何创建一个成语词典程序,使用fscanf和正则表达式处理文本文件中的数据,包括成语、拼音和详细解释,并在Windows命令行环境中处理字符编码问题,实现成语接龙功能。
摘要由CSDN通过智能技术生成

极度无聊,写点代码.

于是整了个成语词典.从网上搜索了个成语典库,手动修正了格式,方便从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 
 

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值