Я знаю, что std::cout
является эквивалентом С++ printf
.
Что такое эквивалент С++ для sprintf
?
Я знаю, что std::cout
является эквивалентом С++ printf
.
Что такое эквивалент С++ для 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
Обновление, август 2019 г.:
Похоже, что С++ 20 будет иметь std::format
. Ссылочная реализация - {fmt}. Если вы ищете альтернативу printf()
сейчас, это станет новым "стандартным" подходом и заслуживает рассмотрения.
Оригинал:
Используйте Boost.Format. Он имеет синтаксис printf
-like, безопасность типов, результаты std::string
и множество других интересных вещей. Ты не вернешься.
sprintf отлично работает на С++.
Вы можете использовать заголовочный файл iomanip для форматирования выходного потока. Проверьте этот!
Здесь хорошая функция для С++ sprintf. Потоки могут стать уродливыми, если вы слишком сильно их используете.
std::string string_format(const std::string &fmt, ...) {
int n, 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)
return str;
if (n > -1)
size = n + 1;
else
size *= 2;
}
}
В С++ 11 и более поздних версиях std::string гарантировано использование непрерывного хранилища, которое заканчивается на '\0'
, поэтому законно передавать его на char *
с помощью &str[0]
.
Используйте поток строк для достижения такого же эффекта. Кроме того, вы можете включить <cstdio>
и использовать snprintf.
В зависимости от того, что именно вы планируете использовать в 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()
даже не может мечтать о строковых типах - что-то вроде метода Java Object.toString()
.