LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1081|回复: 14

谁来点拨一下

[复制链接]
发表于 2006-1-14 22:32:53 | 显示全部楼层 |阅读模式
test1.cpp

  1. #include <iconv.h>
  2. #include <iostream>

  3. using namespace std;

  4. int main(){
  5.         char* inbuf=strdup("123456");

  6.         char* outbuf=(char *)malloc(sizeof(char)*10);
  7.         memset(outbuf, 0, 10 );
  8.        
  9.         cout<<"inbuf_before:"<<inbuf<<endl;
  10.         cout<<"outbuf_before:"<<outbuf<<endl;
  11. //        cout<<"&outbuf_before:"<<&outbuf<<endl;

  12.         size_t inbytesleft=strlen(inbuf);
  13.         size_t outbytesleft=10;

  14.         //please take a look following lines
  15.         //start..
  16.         iconv_t cd;
  17.         char **pin = &inbuf;
  18.         char **pout = &outbuf;
  19.        
  20.         cd = iconv_open("utf-8","gbk");
  21.         memset(outbuf,0,outbytesleft);
  22.         iconv(cd,pin,&inbytesleft,pout,&outbytesleft);
  23.         iconv_close(cd);
  24.         //..end

  25.         cout<<"inbuf_after:"<<inbuf<<endl;
  26.         cout<<"outbuf_after:"<<outbuf<<endl;
  27. //        cout<<"&outbuf_after:"<<&outbuf<<endl;

  28.         free(inbuf);
  29.         free(outbuf);
  30. }
复制代码


test2.cpp

  1. #include <iconv.h>
  2. #include <iostream>

  3. using namespace std;

  4. void convert(char * inbuf, char* outbuf, size_t inbytesleft, size_t outbytesleft);

  5. int main(){
  6.         char* inbuf=strdup("123456");

  7.         char* outbuf=(char *)malloc(sizeof(char)*10);
  8.         memset(outbuf, 0, 10 );
  9.        
  10.         cout<<"inbuf_before:"<<inbuf<<endl;
  11.         cout<<"outbuf_before:"<<outbuf<<endl;
  12. //        cout<<"&outbuf_before:"<<&outbuf<<endl;

  13.         size_t inbytesleft=strlen(inbuf);
  14.         size_t outbytesleft=10;

  15.         //please take a look following lines
  16.         //start..
  17.         convert(inbuf, outbuf, inbytesleft, outbytesleft);
  18.         //..end

  19.         cout<<"inbuf_after:"<<inbuf<<endl;
  20.         cout<<"outbuf_after:"<<outbuf<<endl;
  21. //        cout<<"&outbuf_after:"<<&outbuf<<endl;

  22.         free(inbuf);
  23.         free(outbuf);
  24. }

  25. //move the convert block to a function.
  26. void convert(char * inbuf, char* outbuf, size_t inbytesleft, size_t outbytesleft){
  27.         iconv_t cd;
  28.         char **pin = &inbuf;
  29.         char **pout = &outbuf;
  30.        
  31.         cd = iconv_open("utf-8","gbk");
  32.         memset(outbuf,0,outbytesleft);
  33.         iconv(cd,pin,&inbytesleft,pout,&outbytesleft);
  34.         iconv_close(cd);
  35. }
复制代码

执行结果为:

  1. # g++ -o test1 test1.cpp
  2. # ./test1
  3. inbuf_before:123456
  4. outbuf_before:
  5. inbuf_after:
  6. outbuf_after:
  7. # g++ -o test2 test2.cpp
  8. # ./test2
  9. inbuf_before:123456
  10. outbuf_before:
  11. inbuf_after:123456
  12. outbuf_after:123456
复制代码

其中test2是期望的结果。

可test1的问题在哪呢?
发表于 2006-1-15 07:31:16 | 显示全部楼层
还真没有看出来是什么原因,建议用inline
回复 支持 反对

使用道具 举报

发表于 2006-1-15 09:16:00 | 显示全部楼层
好好看看iconv的manpage,想想为什么函数原型是指向指针的指针
再比较下面两幅图中inbuf和outbuf有什么不同,你最后的free对不对
还有,c语言参数是传值的
如果所有你都搞清楚了就明白你为什么错了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2006-1-15 09:23:22 | 显示全部楼层
帖一个修正的版本[PHP]#include <iconv.h>
#include <iostream>

using namespace std;

int main(){
        char* inbuf=strdup("123456");

        char* outbuf=(char *)malloc(sizeof(char)*10);
        memset(outbuf, 0, 10 );
       
        cout<<"inbuf_before:"<<inbuf<<endl;
        cout<<"outbuf_before:"<<outbuf<<endl;
//        cout<<"&outbuf_before:"<<&outbuf<<endl;

        size_t inbytesleft=strlen(inbuf);
        size_t outbytesleft=10;

        //please take a look following lines
        //start..
        iconv_t cd;
        char **pin = &inbuf;
        char **pout = &outbuf;
        char *in_bak = inbuf;
        char *out_bak = outbuf;
       
        cd = iconv_open("utf-8","gbk");
        memset(outbuf,0,outbytesleft);
        if (iconv(cd,pin,&inbytesleft,pout,&outbytesleft) == -1){
          perror("iconv");
        }
        iconv_close(cd);
        //..end

        cout<<"inbuf_after:"<<in_bak<<endl;
        cout<<"outbuf_after:"<<out_bak<<endl;
//        cout<<"&outbuf_after:"<<&outbuf<<endl;

        free(in_bak);
        free(out_bak);
}
[/PHP]
回复 支持 反对

使用道具 举报

发表于 2006-1-15 09:51:25 | 显示全部楼层
Post by nait
好好看看iconv的manpage,想想为什么函数原型是指向指针的指针
再比较下面两幅图中inbuf和outbuf有什么不同,你最后的free对不对
还有,c语言参数是传值的
如果所有你都搞清楚了就明白你为什么错了

请问,那个Emacs里面的那些栈窗口、Watch窗口是怎么做出来的?
回复 支持 反对

使用道具 举报

发表于 2006-1-15 10:02:55 | 显示全部楼层
这就是传说中的gud
emacs自带的
回复 支持 反对

使用道具 举报

发表于 2006-1-15 10:07:44 | 显示全部楼层
我的gud怎么就这样呢?
最多就是代码同步显示,没有什么Watch窗口之类的,那些窗口是怎么弄出来的呀?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2006-1-15 10:22:02 | 显示全部楼层
M-x gdb-many-windows RET
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-15 10:52:44 | 显示全部楼层
多谢, 简直是图文并茂.

明白了, 开始的确没领会iconv中的解释. 没注意inbuf, outbuf的指针也在跟着跑.
回复 支持 反对

使用道具 举报

发表于 2006-1-15 11:10:07 | 显示全部楼层
Post by nait
M-x gdb-many-windows RET

奇怪,我没有这个命令呀,你是不是装了什么插件的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表