wangxd5429
驱动牛犊
驱动牛犊
  • 注册日期2005-05-12
  • 最后登录2019-08-19
  • 粉丝0
  • 关注0
  • 积分-257分
  • 威望268点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1128回复:0

关于linux下C编程的问题1

楼主#
更多 发布于:2017-05-11 10:14
各位高手,小弟正在开发电子词典,使用linuxC编程技术。从网上下载了一个WINDOWS下的电子词典源代码,然后下载了一个dict.txt文件。移植了一小段WINDOWS下的代码到linux下,编译测试发现系统进入死循环。调试了一下,系统进入了以下while死循环中:
unsigned short * translate(unsigned char* sbuf)
{
   int i=0,j=0;
   int nsize = strlen(sbuf); //unsigned char 为单字节,unsigned short 为双字节
   unsigned char * strbuf = (unsigned char*)calloc(2,nsize+1); //重新为strbuf分配多一倍的字节空间
   
   while(*(sbuf+i))           //一直进行转换直到文件末                      
  {
       if(*(sbuf+i)<0x80    //如果要转换的为单字节时(ASCII0000-007F 则转换为0xxx xxxx
       {
           *(strbuf+j)=*(sbuf+i);
           *(strbuf+j+1)=0;
           i++;
           j+=2;
       }                
       else if((*(sbuf+i)&0xe0)==0xc0)  //如果要转换的为双字节 0080-07FF:则转换为110xxxxx 10xxxxxx
       {                      
           *(strbuf+j)=(*(sbuf+i)<<6)|(*(sbuf+i+1)&0x3f);
           *(strbuf+j+1)=(*(sbuf+i)>>2)&0x07;
           i+=2;
           j+=2;
       }
       else if((*(sbuf+i)&0xf0)==0xe0)   //如果要转换的为三字节 0800-FFFF则转换为1110xxxx 10xxxxxx 10xxxxxx
       {
           *(strbuf+j)=(*(sbuf+i+1)<<6)|(*(sbuf+i+2)&0x3f);
           *(strbuf+j+1)=(*(sbuf+i)<<4)|((*(sbuf+i+1)>>2)&0x0f);
           i+=3;
           j+=2;
        }
  }
(strbuf+j)=0;         //为宽字符集增加结尾标志
  *(strbuf+j+1)=0;
  return (unsigned short *)strbuf; //strbuf的类型转化为双字节unsigned short
}
Sbuf缓冲区保存从dict.txt文件中读出的数据,调试发现,不是所有的数据都满足ifelse if的条件,导致i值未被更新,使得系统无法退出while循环。请教各位高手,是不是dict.txt文件内容不适合此代码?如果不适合,该去哪里下载dict.txt文件?谢谢!
游客

返回顶部