本文主要是介绍如何徒手搓出一个命令行版的成语词典,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
极度无聊,写点代码.
于是整了个成语词典.从网上搜索了个成语典库,手动修正了格式,方便从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
这篇关于如何徒手搓出一个命令行版的成语词典的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!