免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6457 | 回复: 4
打印 上一主题 下一主题

iconv转码,报段错误。大家看看是怎么回事? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-30 19:13 |只看该作者 |倒序浏览
我在linux下
写了一程序把UTF-8转成GB2312
报段错误。但是我用命令iconv转换却是成功的。郁闷。。。
大家看看吧。


代码:


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

  3. int
  4. main(int argc, char **argv) {

  5.         char *infile_name, *outfile_name;
  6.         FILE *infile, *outfile;
  7.         char in_buffer[1024];
  8.         char out_buffer[1024];
  9.         int o_len;
  10.         int i_len;
  11.         iconv_t   conv;

  12.         if (argc <= 2) {
  13.                 printf("Usage: %s inputfile outfile\n", argv[0]);
  14.                 return(0);
  15.         }

  16.         infile_name = argv[1];
  17.         outfile_name = argv[2];

  18.         conv = iconv_open("GB2312", "UTF-8");
  19.         if(conv == (iconv_t)-1)
  20.         {
  21.                 perror("iconv_open");
  22.                 exit(1);
  23.         }


  24.         infile = fopen(infile_name, "r");
  25.         if(infile == NULL)
  26.         {
  27.                 perror("fopen");
  28.                 exit(1);
  29.         }
  30.        
  31.         outfile = fopen(outfile_name, "w");
  32.         if(outfile == NULL)
  33.         {
  34.                 perror("fopen");
  35.                 exit(1);
  36.         }

  37.         while(fgets(in_buffer, 1024, infile) != NULL)
  38.         {
  39.                 i_len = strlen(in_buffer);
  40.                                 o_len = sizeof(out_buffer);
  41.                 printf("in_buffer=[%s]\n", in_buffer);
  42.                 if(iconv(conv, (char **)&in_buffer, &i_len, (char **)&out_buffer, &o_len ) == -1)
  43.                 {
  44.                         perror("iconv");
  45.                         break;
  46.                 }
  47.                 fputs(out_buffer, outfile);
  48.         }

  49.         fclose(infile);
  50.         fclose(outfile);
  51.        
  52.         if(iconv_close(conv) == -1)
  53.         {
  54.                 perror("iconv_close");
  55.                 exit(1);
  56.         }

  57.         return (1);
  58. }

复制代码

[ 本帖最后由 MackedNice 于 2006-11-30 19:23 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-11-30 19:26 |只看该作者

  1. 50                      if(iconv(conv, (char **)&in_buffer, &i_len, (char **)&out_buffer, &o_len ) == -1)
  2. (gdb) n

  3. Program received signal SIGSEGV, Segmentation fault.
  4. 0x00916654 in __gconv_transform_utf8_internal () from /lib/tls/libc.so.6
  5. (gdb) where
  6. #0  0x00916654 in __gconv_transform_utf8_internal () from /lib/tls/libc.so.6
  7. #1  0x009123e5 in __gconv () from /lib/tls/libc.so.6
  8. #2  0x00911a0a in iconv () from /lib/tls/libc.so.6
  9. #3  0x08048727 in main (argc=3, argv=0xbff71554) at test3.c:50
  10. (gdb) bt
  11. #0  0x00916654 in __gconv_transform_utf8_internal () from /lib/tls/libc.so.6
  12. #1  0x009123e5 in __gconv () from /lib/tls/libc.so.6
  13. #2  0x00911a0a in iconv () from /lib/tls/libc.so.6
  14. #3  0x08048727 in main (argc=3, argv=0xbff71554) at test3.c:50
  15. (gdb)
复制代码

这是调试的信息

求职 : 数据库管理员
论坛徽章:
0
3 [报告]
发表于 2006-11-30 20:20 |只看该作者

  1.         char *inp ,*outp
  2.         while(fgets(in_buffer, 1024, infile) != NULL)
  3.         {
  4.                 outp= out_buffer ;
  5.                 inp = in_buffer ;
  6.                  i_len = strlen(in_buffer);
  7.                                 o_len = sizeof(out_buffer);
  8.                 printf("in_buffer=[%s]\n", in_buffer);
  9.                 if(iconv(conv, (char **)&inp, &i_len, (char **)&outp, &o_len ) == -1)
  10.                 {
  11.                         perror("iconv");
  12.                         break;
  13.                 }
  14.                 fputs(out_buffer, outfile);
  15.         }

复制代码

论坛徽章:
0
4 [报告]
发表于 2006-11-30 22:19 |只看该作者
原帖由 gangjh 于 2006-11-30 20:20 发表
[code]
        char *inp ,*outp
        while(fgets(in_buffer, 1024, infile) != NULL)
        {
                outp= out_buffer ;
                inp = in_buffer ;
                 i_len = s ...



OK。好了。。。。。
谢谢gangjh
我疏忽了那是个指针的指针。。。
如果把buffer指针直接付给它。那么buffer指针所指向的地址会发生改变的。
多谢。。。

论坛徽章:
0
5 [报告]
发表于 2006-12-08 21:45 |只看该作者
原帖由 MackedNice 于 2006-11-30 22:19 发表



OK。好了。。。。。
谢谢gangjh
我疏忽了那是个指针的指针。。。
如果把buffer指针直接付给它。那么buffer指针所指向的地址会发生改变的。
多谢。。。

我把代码看了看。。。这段话的意思不明白。。哪位大侠解释下??
感激不尽!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP