Chinaunix

标题: putchar 对引用的会有字符串有影响?? [打印本页]

作者: 萎代码    时间: 2009-02-26 14:59
标题: putchar 对引用的会有字符串有影响??
下面的代码 屏蔽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

先谢谢各位大侠先
作者: zhuhefang2006    时间: 2009-02-26 23:40
什么叫屏蔽putchar啊,怎么看不懂啊
作者: 萎代码    时间: 2009-02-27 08:16
哦,不规范,我这里 屏蔽 的意思是 注释。
你方便试试这些代码在你的机器 是否有类似的现象吗?
作者: Roemer    时间: 2009-02-27 08:28
你启用putchar自然要多打印一些东西了。putchar也要输出~
作者: 萎代码    时间: 2009-02-27 10:02
对对,写代码写晕了,呵呵,太感谢楼上的
想实现像printf一样可以格式化的取结构里面的数据的。
不知你有什么好建议好思路呢?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2