免费注册 查看新帖 |

Chinaunix

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

[C] putchar 对引用的会有字符串有影响?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-26 14:59 |只看该作者 |倒序浏览
下面的代码 屏蔽putchar和不屏蔽putchar 打印的结果是不同的,putchar会对引用的字符串有影响??


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdarg.h>

  5. typedef struct {
  6.         int Id;
  7.         int DevId;
  8.         char Name[32];
  9.         char Desc[64];
  10. }DevStateDesc;

  11. DevStateDesc data[4] = { {1,11,"name11","desc11"},
  12.                          {2,22,"name22","desc22"},
  13.                          {2,22,"name222","desc222"},
  14.                          {3,33,"name33","desc33"} };

  15. #ifndef WIN32
  16. DevStateDesc *getData(char* format,...)
  17. #else
  18. DevStateDesc *getData(char* format,va_alist)
  19. va_dcl
  20. #endif
  21. {

  22.         va_list list;
  23.         char *tmp = NULL;
  24.         int arg_len = 0;
  25.         int i=0;
  26.         char *string = strdup(format);
  27.         char *sep = "%";
  28.         char *token = NULL;

  29. #ifndef WIN32
  30.         va_start(list,format);
  31. #else
  32.         va_start(list);
  33. #endif
  34. //test the first wheather is NULL
  35.         if (va_arg(list,char*) == NULL )
  36.         {
  37.                 goto END_CODE;
  38.         }
  39.         else
  40.         {
  41.                 va_end(list);
  42. //start again
  43. #ifndef WIN32
  44.                 va_start(list,format);
  45. #else
  46.                 va_start(list);
  47. #endif
  48.         }
  49. //token by %
  50.         token = strtok(string,sep);
  51.         while( token != NULL)
  52.         {
  53.                 //printf("%s\n",token);
  54.                 char c = *token;
  55.                 //putchar(c);
  56.                 {
  57.                         switch(*token)
  58.                         {
  59.                         case 'd':
  60.                                 printf("%s is  int type %d\n",++token,va_arg(list,int));
  61.                                 break;
  62.                         case 's':
  63.                                 printf("%s is char pointer %s\n",++token,va_arg(list,char*));
  64.                                 break;

  65.                         default :
  66.                                 printf("default");
  67.                                 break;

  68.                         }
  69.                 }
  70.                 token = strtok(NULL,sep);
  71.         }
  72. END_CODE:
  73.         va_end(list);
  74.         free(string);
  75.         return NULL;
  76. }

  77. int main(int argc, char *argv[])
  78. {
  79.         getData("%dId%sName",2,"name22",NULL);

  80.         return 1;
  81. }


复制代码


屏蔽的打印结果是
Id is  int type 2
Name is char pointer name22

不屏蔽的打印结果是
dId is  int type 2
sName is char pointer name22

先谢谢各位大侠先

论坛徽章:
0
2 [报告]
发表于 2009-02-26 23:40 |只看该作者
什么叫屏蔽putchar啊,怎么看不懂啊

论坛徽章:
0
3 [报告]
发表于 2009-02-27 08:16 |只看该作者
哦,不规范,我这里 屏蔽 的意思是 注释。
你方便试试这些代码在你的机器 是否有类似的现象吗?

论坛徽章:
0
4 [报告]
发表于 2009-02-27 08:28 |只看该作者
你启用putchar自然要多打印一些东西了。putchar也要输出~

论坛徽章:
0
5 [报告]
发表于 2009-02-27 10:02 |只看该作者
对对,写代码写晕了,呵呵,太感谢楼上的
想实现像printf一样可以格式化的取结构里面的数据的。
不知你有什么好建议好思路呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP