c++ - 使用 printf 样式格式设置 std::string 的内容

标签 c++ printf stdstring

<分区>

我想将使用 printf 类型格式化字符串格式化的文本放入 C++ 字符串中。我想出了以下方法,它似乎有效,但我还没有发现其他人承认使用类似的技术,所以我想我会问为什么我不应该这样做的原因。

#include <stdio.h>
#include <stdarg.h>
#include <string>

void stringprintf(std::string &str, char const *fmt, ...) {
    va_list    ap;

    va_start(ap, fmt);
    size_t n = vsnprintf(NULL, 0, fmt, ap);
    str.resize(n + 1, '\0');
    char *pStr = (char *)(str.c_str());
    (void)vsnprintf(pStr, str.capacity(), fmt, ap);
    va_end(ap);
}

void dumpstring(std::string &str) {
    printf("Object: %08X, buffer: %08X, size: %d, capacity: %d\ncontents: %s==\n", 
        &str, str.c_str(), str.size(), str.capacity(), str.c_str());
}

int main(int argc, char **argv) {
    std::string str;

    dumpstring(str);
    stringprintf(str, "A test format. A number %d, a string %s!\n", 12345, "abcdefg");
    printf("%s", str.c_str());
    dumpstring(str);
    return 0;
}

最佳答案

只需使用 operator[](即 &str[0])代替 c_str()。然后没有未定义的行为。

vsnprintf(&str[0], str.capacity(), fmt, ap);

完成后您可能应该去掉空终止符,因为 std::string 不需要它。

str.pop_back();

关于c++ - 使用 printf 样式格式设置 std::string 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20301398/

相关文章:

C编程: How to prevent printf statement from printing out new line values?

c - 如何打印链表中除最后一个元素之外的每个元素

c - sprintf 和 uint64_t 未使用 PRIu64 正确格式化

c++ - 如何在 C++ 中有效地将集合格式化为字符串?

c++ - 从 fstream 读取单个字符?

c++ - 使用波浪号获取 int 的 MAX 值

c++ - std::string 在第一次分配中不使用自定义分配器

c++ - 在 C++ 中填充 STL 字符串

java - 如何通过包装类直接访问类成员方法

c++ - 使用 ffmpeg API 将 pcm_alaw 类型的音频数据包装成 MKA 音频文件