2012-07-06 108 views
1

我得到一个错误的指针(0xcccccccc),用于临时的异常下面下壳体的':C++ - va_list的错误指针

string Logger::format(const char *str, va_list args) 
{ 
    ostringstream output; 

    for(int i = 0; i < strlen(str); ++i) 
    { 
     if(str[i] == '%' && str[i+1] != '%' && i+1 < strlen(str)) 
     { 
      switch(str[i+1]) 
      { 
      case 's': 
      { 
       char *temp = va_arg(args, char*); 
       output << temp; 
       break; 
      } 
      case 'i': 
      { 
       int temp = va_arg(args, int); 
       output << temp; 
       break; 
      } 
      case 'd': 
      { 
       double temp = va_arg(args, double); 
       output << temp; 
       break; 
      } 
      case 'f': 
      { 
       float temp = va_arg(args, float); 
       output << temp; 
       break; 
      } 
      default: 
       output << str[i]; 
      } 

      i++; 
     } 
     else 
     { 
      output << str[i]; 
     } 
    } 

    return output.str(); 
} 

上述功能是通过此称为:

void Logger::debugFormat(string message, ...) 
{ 
    const char* cstr = message.c_str(); 

    va_list args; 
    va_start(args, cstr); 

    record(DEBUGGING, format(cstr, args)); 

    va_end(args); 
} 

我打电话的这种方式在我所有的代码

Logger::debugFormat("Loading Image %s", path.c_str()); 

任何其他类型(INT,双,浮法)上述工作的所有罚款。任何帮助表示赞赏。

+2

你在哪里创建va_list?你需要在调用va_arg之前在某处调用va_start – 2012-07-06 23:35:03

+0

我很困惑,为什么你不只是使用'sprintf'而不是重新发明轮子。如果您要重塑它,请通过可变模板使用类型安全版本。上面固定的 – chris 2012-07-06 23:39:25

+0

。那么这是一个记录器。我可以通过重定向cout来将printf设置为打印到文件而不是控制台? – will 2012-07-06 23:40:24

回答

4

您没有正确使用va_start。第二个参数应该是函数参数,之后变量列表(由...表示)开始。也就是说,它应该是:

va_start(args, message);