我正在学习C++。cout
是std::ostream
类的一个实例。如何使用它打印带格式的字符串?
我仍然可以使用printf
,但我想学习一种适当的C++方法,它可以利用C++的所有好处。我认为使用std::ostream
应该可以做到这一点,但是我找不到合适的方法。
发布于 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;
&
发布于 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
发布于 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
https://stackoverflow.com/questions/15106102
复制相似问题