免费注册 查看新帖 |

Chinaunix

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

[函数] 【请教】printf函数输出中的一个奇怪问题,请教高手。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-02 07:54 |只看该作者 |倒序浏览
本人在学习 C 语言的 正则表达式时,参考 http://bbs.chinaunix.net/viewthread.php?tid=303346 文章,在调试文章的实例程序时,做了一些微小的改动,但是有一个奇怪的问题。

代码如下:


  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <regex.h>

  4. static char* substr(const char *str, unsigned start, unsigned end)
  5. {
  6.     static char stbuf[256];
  7.     unsigned n = end - start;

  8.     strncpy(stbuf, str + start, n);
  9.     stbuf[n] = 0;

  10.     return stbuf;
  11. }

  12. int main(int argc, char *argv[])
  13. {
  14.     char *pattern;
  15.     int x = 0;
  16.     int z = 0;
  17.     int cflags = REG_EXTENDED;
  18.     int line_num = 0;

  19.     char ebuf[128];
  20.     char inbuf[256];

  21.     regex_t reg;

  22.     const size_t nmatch = 10;
  23.     regmatch_t pmatch[10];

  24.     if (argc < 2)
  25.         return 1;

  26.     pattern = argv[1];
  27.     z = regcomp(&reg, pattern, cflags);
  28.     if (z != 0)
  29.     {
  30.         regerror(z, &reg, ebuf, sizeof(ebuf));
  31.         fprintf(stderr, "%s:pattern '%s' \n", ebuf, pattern);
  32.         return 2;
  33.     }

  34.     while(fgets(inbuf, sizeof(inbuf), stdin))
  35.     {
  36.         line_num++;

  37.         if ((z = strlen(inbuf)) > 0 && inbuf[z-1] == '\n')
  38.             inbuf[z-1]=0;

  39.         z = regexec(&reg, inbuf, nmatch, pmatch, 0);

  40.         if (z == REG_NOMATCH)
  41.             continue;
  42.         else if (z != 0)
  43.         {
  44.             regerror(z, &reg, ebuf, sizeof(ebuf));
  45.             fprintf(stderr, "%s: regcom('%s') \n", ebuf, inbuf);
  46.             return 3;
  47.         }

  48.         for (x = 0; x < nmatch; ++x)
  49.         {
  50.             if (pmatch[x].rm_so == -1)
  51.                 continue;

  52.             if (!x)
  53.                 printf("%04d: %s \n", line_num, inbuf);

  54.             printf("x=%d\t rm_so=%d\t rm_eo=%d\n", x, pmatch[x].rm_so, pmatch[x].rm_eo);

  55.             printf("x=%d\t",x);
  56.             printf("rm_so=%d\t",pmatch[x].rm_so);
  57.             printf("rm_eo=%d\n",pmatch[x].rm_eo);

  58.             printf("  $%d='%s' \n", x, substr(inbuf, pmatch[x].rm_so, pmatch[x].rm_eo));
  59.         }
  60.     }

  61.     regfree(&reg);

  62.     return 0;
  63. }
复制代码


程序的尾部,在输出的部分:

  1.           printf("x=%d\t rm_so=%d\t rm_eo=%d\n", x, pmatch[x].rm_so, pmatch[x].rm_eo);
复制代码


的输出结果和:


  1.             printf("x=%d\t",x);
  2.             printf("rm_so=%d\t",pmatch[x].rm_so);
  3.             printf("rm_eo=%d\n",pmatch[x].rm_eo);
复制代码


的输出结果不一样。第一个的输出结果中,前两个变量的输出结果正常,但是,第三个变量的输出结果,输出的结果为 0 ,实际上 pmatch[x].rm_eo 的值并不为0。

本人在 FreeBSD 6.0-RELEASE 和 FreeBSD 5.3-RELEASE 都试过,结果一样。
GCC 版本分别为:gcc version 3.4.4 和 gcc version 3.4.2

为什么呢?虽然去掉哪个 printf 也不影响程序运行,但是,为什么会为 0 呢?

本人百思不得其解,只好请教CU的各位高手了。

[ 本帖最后由 jeffwu 于 2006-1-2 14:02 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-01-02 07:56 |只看该作者
编译,运行的命令如下:

$ gcc -o reg reg.c
$ ./reg '(pmatch)' < reg.c

输出结果如下:



  1. 0030:     regmatch_t pmatch[10];
  2. x=0      rm_so=15        rm_eo=0
  3. x=0  rm_so=15        rm_eo=21
  4.   $0='pmatch'
  5. x=1      rm_so=15        rm_eo=0
  6. x=1  rm_so=15        rm_eo=21
  7.   $1='pmatch'
  8. 0051:         z = regexec(&reg, inbuf, nmatch, pmatch, 0);
  9. x=0      rm_so=41        rm_eo=0
  10. x=0  rm_so=41        rm_eo=47
  11.   $0='pmatch'
  12. x=1      rm_so=41        rm_eo=0
  13. x=1  rm_so=41        rm_eo=47
  14.   $1='pmatch'
  15. 0064:             if (pmatch[x].rm_so == -1)
  16. x=0      rm_so=16        rm_eo=0
  17. x=0  rm_so=16        rm_eo=22
  18.   $0='pmatch'
  19. x=1      rm_so=16        rm_eo=0
  20. x=1  rm_so=16        rm_eo=22
  21.   $1='pmatch'
  22. 0070:             printf("x=%d\t rm_so=%d\t rm_eo=%d\n", x, pmatch[x].rm_so, pmatch[x].rm_eo);
  23. x=0      rm_so=62        rm_eo=0
  24. x=0  rm_so=62        rm_eo=68
  25.   $0='pmatch'
  26. x=1      rm_so=62        rm_eo=0
  27. x=1  rm_so=62        rm_eo=68
  28.   $1='pmatch'
  29. 0072:             printf("rm_so=%d\t",pmatch[x].rm_so);
  30. x=0      rm_so=32        rm_eo=0
  31. x=0  rm_so=32        rm_eo=38
  32.   $0='pmatch'
  33. x=1      rm_so=32        rm_eo=0
  34. x=0001  rm_so=32        rm_eo=38
  35.   $1='pmatch'
  36. 0073:             printf("rm_eo=%d\n",pmatch[x].rm_eo);
  37. x=0      rm_so=32        rm_eo=0
  38. x=0  rm_so=32        rm_eo=38
  39.   $0='pmatch'
  40. x=1      rm_so=32        rm_eo=0
  41. x=1  rm_so=32        rm_eo=38
  42.   $1='pmatch'
  43. 0074:             printf("  $%d='%s' \n", x, substr(inbuf, pmatch[x].rm_so, pmatch[x].rm_eo));
  44. x=0      rm_so=53        rm_eo=0
  45. x=0  rm_so=53        rm_eo=59
  46.   $0='pmatch'
  47. x=1      rm_so=53        rm_eo=0
  48. x=1  rm_so=53        rm_eo=59
  49.   $1='pmatch'
复制代码

[ 本帖最后由 jeffwu 于 2006-1-2 14:00 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-01-02 12:35 |只看该作者
建议用perl解决这类问题

论坛徽章:
0
4 [报告]
发表于 2006-01-02 13:59 |只看该作者
perl 和 php 等都可以使用正则表达式,只是不明白,在FB下为什么那段代码,两种应该是输出同样结果的代码却输出了不同的结果。

第三个变量为什么会输出 0 呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP