首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将C++ std::ostream与类似于printf的格式一起使用?

如何将C++ std::ostream与类似于printf的格式一起使用?
EN

Stack Overflow用户
提问于 2013-02-27 15:07:01
回答 5查看 80.2K关注 0票数 48

我正在学习C++。coutstd::ostream类的一个实例。如何使用它打印带格式的字符串?

我仍然可以使用printf,但我想学习一种适当的C++方法,它可以利用C++的所有好处。我认为使用std::ostream应该可以做到这一点,但是我找不到合适的方法。

EN

回答 5

Stack Overflow用户

发布于 2020-01-28 01:14:06

这是一个我已经习惯了的成语。希望它能有所帮助:

// Hacky but idiomatic printf style syntax with c++ <<

#include <cstdlib> // for sprintf

char buf[1024]; sprintf(buf, "%d score and %d years ago", 4, 7);
cout << string(buf) <<endl;

&

票数 12
EN

Stack Overflow用户

发布于 2018-09-05 19:33:36

我建议使用ostream而不是ostream,请参见以下示例:

#include <vector>
#include <string>
#include <iostream>
#include "CppUnitTest.h"

#define _CRT_NO_VA_START_VALIDATION

std::string format(const std::string& format, ...)
{
    va_list args;
    va_start(args, format);
    size_t len = std::vsnprintf(NULL, 0, format.c_str(), args);
    va_end(args);
    std::vector<char> vec(len + 1);
    va_start(args, format);
    std::vsnprintf(&vec[0], len + 1, format.c_str(), args);
    va_end(args);
    return &vec[0];
}

示例用法:

std::ostringstream ss;
ss << format("%s => %d", "Version", Version) << std::endl;
Logger::WriteMessage(ss.str().c_str()); // write to unit test output
std::cout << ss.str() << std::endl; // write to standard output
票数 8
EN

Stack Overflow用户

发布于 2018-09-01 22:28:29

我独立编写,但得到了类似于user3283405的答案

我的解决方案使用vasprintf()来加速格式化,并使用std::ostream的<<操作符重载来释放正确位置的内存。

用法:

std::cout << putf(const char *format, ...); //Same format as C printf(3)

代码:

#define _GNU_SOURCE
#include <cstdarg>
#include <iostream>
#include <cstdio>

struct putf_r{
        char *s;
};

putf_r putf(const char *fmt, ...){
        va_list ap;
        va_start(ap, fmt);
        putf_r a;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
        vasprintf(&a.s, fmt, ap);
#pragma GCC diagnostic pop
        va_end(ap);
        return a;
}

std::ostream& operator<<(std::ostream& os, putf_r a){
        os<<a.s;
        free(a.s);
        return os;
}

int main(){
        std::cout << putf("%3d\n", 23) << putf("%a\n", 256.);
}

请注意,编译器不会检查putf()中的格式,因此编译器标志-Wformat-nonliteral不会对putf()中的可疑代码发出警告,您需要自己处理uncontrolled format string问题。

有关详细信息,请访问GitHub

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15106102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档