2017-04-10 231 views
2

我有一个奇怪的问题_snprintf功能, 代码:C++ _snprintf返回-1

char string1[] = "string"; 
char string2[] = "Description"; 
char string3[] = "BIOS Date: 05/12/15 15:30:43 Ver: 04.06.05"; 
char *buffer = new char[64]; 
int resx = _snprintf(buffer, 64, "[%03u] %s %s = (%s)", 16, string1, string2, string3); 

对于我来说,返回-1,但是为什么呢? 在文档中说-1发生编码错误时返回,但我没有编码任何东西,没有unicode格式? 我只需要长度值扩大缓冲区

我也尝试过它会导致断言_snprintf_s,但必须返回一个needen长度

我也不能采取足够大的缓冲区,因为字符串1,字符串,STRING3能在实际情况任意字符串

谢谢

编辑: 最后,在Visual Studio中为我工作的解决方案2013年和2015年 EDIT2: 的va_list的固定用法(谢谢MCH)

string format(const char *fmt, ...) 
{ 
    string result; 

    va_list vl1, vl2; 
    va_start(vl1, fmt); 
    va_copy(vl2, vl1); 

    int needen_size = _vsnprintf(nullptr, 0, fmt, vl1); 
    if (needen_size > 0) 
    { 
     if (char *buffer = new char[needen_size + 1]) { 
      _vsnprintf(buffer, needen_size, fmt, vl2); 
      buffer[needen_size] = '\0'; 
      result.assign(buffer); 
      delete[] buffer; 
     } 
    } 

    va_end(vl1); 
    va_end(vl2); 

    return result; 
} 
+1

”不是个t产生的字符串长度> 64个字符? –

+0

是的,但我需要知道要分配多少以适应所有内容 在写入的文档中,结果值必须是needen长度,但它会返回-1,如发生错误 – Annett

+0

您在什么平台上使用'_snprintf'和'snprintf '(注意下划线)? –

回答

2

当您通过零大小和为NULL指针返回你必须分配/缓冲区大小:

char string1[] = "string"; 
char string2[] = "Description"; 
char string3[] = "BIOS Date: 05/12/15 15:30:43 Ver: 04.06.05"; 

resx = _snprintf(NULL, 0, "[%03u] %s %s = (%s)", 16, string1, string2, string3); 

然后用正确的尺寸再打电话

char *buffer = new char[resx+1]; 

int resx = _snprintf(buffer, resx, "[%03u] %s %s = (%s)", 16, string1, string2, string3); 
+0

与C99中标准化的行为相比,'_snprintf()'只返回所需的大小以防万一'buffer'是一个空指针。符合'snprintf()'似乎在VS 2015中可用。有趣的是,返回值的定义似乎通过可用的版本发生了变化......请注意,'snprintf'不等于'_snprintf'。 – moooeeeep

+0

谢谢!它的工作,第一篇文章的最终解决方案 – Annett