C++ _snprintf 返回 -1

标签 c++ printf

我的 _snprintf 函数有一个奇怪的问题, 代码:

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 它会导致断言,但必须返回所需的长度

而且我无法获取足够大的缓冲区,因为 string1,string2,string3 可以是实际情况中的任何字符串

谢谢

编辑: 在 Visual Studio 2013 和 2015 中为我工作的最终解决方案 编辑2: 修复了 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;
}

最佳答案

当您为大小传递零并为指针传递 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);

关于C++ _snprintf 返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43321867/

相关文章:

c++ - 什么时候使用 printf/scanf vs cout/cin?

c - 什么时候在 C 中使用 %d 和 %f?

c - fprintf 段错误

c++ - 从 printf 切换到 cout - 复杂格式说明符模式

c++ - C++中sprintf函数的不同输出

c++ - 为数组 : What is the proper way to handle the case of the array size being 0? 制作 C++ max 函数

C++:如何正确地遍历指向的 vector

c++ - arm 汇编代码 - 了解 cpp 源代码的反汇编

c++ - 使用类成员函数作为比较器调用 std::equal 时出错

c++ - 将每行两个单词的文件读取到 2 个不同的 vector 中