Я знаю, что std::cout
это эквивалент printf
.
Что такое эквивалент C ++ sprintf
?
Пример:
#include <iostream>
#include <sstream> // for ostringstream
#include <string>
int main()
{
std::string name = "nemo";
int age = 1000;
std::ostringstream out;
out << "name: " << name << ", age: " << age;
std::cout << out.str() << '\n';
return 0;
}
Вывод:
name: nemo, age: 1000
sprintf (...)
? Вы не можете форматировать данные произвольно, вы должны полагаться на известный тип, когда вы вводите его в поток с помощью<<
оператора.Обновление, август 2019 г .:
Похоже, у C ++ 20 будет
std::format
. Эталонная реализация - {fmt} . Если вы сейчас ищетеprintf()
альтернативу, это станет новым «стандартным» подходом, и его стоит рассмотреть.Оригинал:
Используйте Boost.Format . Он имеет
printf
синтаксис типа -подобный, безопасность типов,std::string
результаты и много других отличных вещей. Вы не вернетесь.источник
sprintf отлично работает на C ++.
источник
Вы можете использовать файл заголовка iomanip для форматирования выходного потока. Проверьте это !
источник
Вот хорошая функция для c ++ sprintf. Потоки могут стать уродливыми, если вы используете их слишком часто.
std::string string_format(const std::string &fmt, ...) { int size=100; std::string str; va_list ap; while (1) { str.resize(size); va_start(ap, fmt); int n = vsnprintf(&str[0], size, fmt.c_str(), ap); va_end(ap); if (n > -1 && n < size) { str.resize(n); // Make sure there are no trailing zero char return str; } if (n > -1) size = n + 1; else size *= 2; } }
В C ++ 11 и более поздних версиях std :: string гарантированно использует непрерывное хранилище, которое заканчивается на
'\0'
, поэтому его допустимо преобразовать вchar *
using&str[0]
.Было указано, что переменные аргументы не должны следовать за передачей по ссылке, а С ++ хорош в том, что не копирует строки, если в этом нет необходимости. В таком случае это исправляет.
std::string string_format(std::string fmt, ...) {
источник
sprintf
точного соответствия -usage.(char*) str.c_str()
выбрасываетconst
.В зависимости от того, что именно вы планируете использовать
sprintf()
,std::to_string()
могут быть полезны и более идиоматичны, чем другие варианты:void say(const std::string& message) { // ... } int main() { say(std::to_string(5)); say("Which is to say " + std::to_string(5) + " words"); }
Главное преимущество
std::to_string()
, IMHO, заключается в том, что его можно легко расширить для поддержки дополнительных типов, которыеsprintf()
даже не могут мечтать о строковой обработке - вроде какObject.toString()
метод Java .источник
Для достижения того же эффекта используйте поток строк. Кроме того, вы можете включить
<cstdio>
и по-прежнему использовать snprintf.источник