【发布时间】:2019-06-05 16:44:00
【问题描述】:
我问过the same question about strncpy,但string 最终包含整个输入字符串。将字符串传递给vsnprintf 时,最后一个字符总是被截断:https://rextester.com/UIQMX91570
为简单起见,我还在代码中内嵌了上面的实时示例链接:
void bar(const char* format, va_list vlist) {
const auto buf_size = vsnprintf(nullptr, 0U, format, vlist);
string buffer(buf_size, '\0');
vsnprintf(data(buffer), buf_size, format, vlist);
cout << data(buffer) << endl;
}
void foo(const char* format, ...) {
va_list vlist;
va_start(vlist, format);
bar(format, vlist);
va_end(vlist);
}
如果我用:foo("lorem ipsum %d", 13) 调用它,我得到的输出是:
lorem ipsum 1
如我所料:lorem ipsum 13
谁能解释这个差异?当我调试时,我得到一个 14 的 buf_size 应该足以包含整个字符串,但它没有:(
【问题讨论】:
-
解释一下答案,为了
strncpy粉丝的利益:strncpy可以产生无效的 C 字符串(没有 nul 终止符);vsnprintf不能。
标签: c++ printf variadic-functions string-length strncpy