2012-07-06 110 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);