Если вы хотите использовать printf
как форматирование, вам, вероятно, следует использовать snprintf
(или создать вариант размещения поверх этого). Обратите внимание, что sprintf
требует, чтобы вы могли гарантировать, что результат не выйдет за пределы буфера, необходимого для сохранения определенного поведения. С другой стороны, snprintf
может гарантировать, что он не переполнит буфер, поскольку вы указываете максимальное количество символов, которые будут записаны в строку (вместо этого он усекает вывод).
Вы даже можете создать что-то, что можно напрямую передать ostream
поверх snprintf
, автоматически выделив буфер и поместив его в объект, который при уничтожении освобождает эту память. Это в дополнение к методу подачи объекта в ostream
завершит его. Что-то вроде (с возможностью улучшения):
struct Format {
char buf[999];
Format(fmt, ...) {
va_list ap;
va_start(fmt, ap);
vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
}
}
ostream& operator<< (ostream& os, Format const& str);
то вы используете это как:
cout << Format("The answer is %d", 42) << endl;
Если вы используете библиотеки GNU, вы, конечно, можете использовать printf
напрямую, поскольку тогда cout
и stdout
являются одним и тем же объектом. В противном случае вам, вероятно, следует избегать смешивания stdio
и iostreams
, так как нет гарантии, что они синхронизированы друг с другом.
person
skyking
schedule
25.10.2015
setprecision
:std::cout << std::fixed << std::setprecision(2) << dNum;
- person Hatted Rooster   schedule 25.10.2015