极度无聊,写点代码.
于是整了个成语词典.从网上搜索了个成语典库,手动修正了格式,方便从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?
?