linux词典工具,基于dic.cn webapi的linux终端词典工具

基于dic.cn webapi的linux终端词典工具

一、由来

因工作和学习需要,需要在linux terminal上使用英汉词典,编写本程序。

程序使用方法:

安装:将d拷贝到/usr/bin目录下:cp d /usr/bin

使用:d lion

源文件编译:

gcc -std=c99 -o d d.c

二、webapi of dict.cn

首先,了解dict.cn的webapi。直接实验,上图给结果,不解释了。

得到:

0818b9ca8b590ca3270a3433284dd417.png

得到:

0818b9ca8b590ca3270a3433284dd417.png

三、使用socket实现http并解析xml文件

由于程序需求比较简单,只是以url的方式向服务器请求xml文件,所以直接使用socket在TCP的基础上实现http;值得注意的是,web上的数据编码可能不同于linux平台的编码,故存在转码的需求。

照例,我们直接上代码。

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

// convert gbk to utf-8

int code_convert(char *from,int fromlen, char *to, int tolen)

{

iconv_t cd;

cd=iconv_open("utf-8","gbk");

if(cd==0)

{

printf("iconv_open failed./n");

return -1;

}

char *pfrom=from;

char *pto=to;

// convert

if(iconv(cd, &pfrom, &fromlen, &pto, &tolen)==-1)

{

printf("iconv error. errorno=%d/n",errno);

return -1;

}

iconv_close(cd);

// out

return 0;

}

int main(int argc, char *argv[])

{

// check paramters.

// we can add more options here...

if(argc<2)

{

printf("syntax error./n");

return 0;

}

// get information fro "www.dict.cn"

// where provide a proper web api we need.

struct hostent *he;

if((he=gethostbyname("www.dict.cn"))==NULL)

{

printf("#can't get IP of www.dict.cn./n");

return -1;

}

// connect to server.

struct sockaddr_in server;

int fd;

if((fd=socket(AF_INET, SOCK_STREAM,0))== -1)

{

printf("#application error./n");

return 0;

}

server.sin_family=AF_INET;

server.sin_port=htons(80);

server.sin_addr=*((struct in_addr*)he->h_addr_list[0]);

if(connect(fd, (struct sockaddr*)&server, sizeof(struct sockaddr))==-1)

{

printf("#can't connect to www.dict.cn; check if your network is down./n");

return -1;

}

// send HTTP request with GET method.

char buf[1024*5]={0};

sprintf(buf,"GET /ws.php?q=%s HTTP/1.1/r/n%s%s%s%s%s",

argv[1],

"Accept: */*/r/n",

"Accept-Language: zh-cn/r/n",

"User-Agent:Mozilla/4.0/r/n",

"Host:dict.cn/r/n",

"Connection: Keep-Alive/r/n/r/n");

send(fd,buf,strlen(buf),0 );

// receive server responce.

recv(fd, buf,1024*5,0);

// analyse server responce string.

char result[1024*5]={0};

// code convertion.

if(0!=code_convert(buf+20,strlen(buf),result,1024*5))

return -1;

char *p;

// valid search ?

p=strstr(result,"");

if(p)

p+=strlen("");

else

{

printf("#zero result of %s/n",argv[1]);

printf("#suggest:/n");

p=result;

while(p=strstr(p,""))

{

p+=strlen("");

printf("/t");

while(*p!='

{

printf("%c",*p++);

}

printf("/n");

}

printf("/n-------------------------------/n");

return 0;

}

printf("/x1b[32m");

while(*p!='

printf("%c",*p++);

printf("/n");

p=strstr(p,"");

if(p)

p+=strlen("");

while(*p!='

printf("%c",*p++);

printf("/n---------------------------------/n/x1b[0m");

return 0;

}

四、结语

由于各个版本的linux终端编码方式可能存在差异,所以可以根据需要改变源程序中的转码子程序,确保程序运行时不出现乱码。

正如你所想到的,可以为程序提供更多的options来扩展其功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值