Я знаю, что std::cout
это эквивалент printf
.
Что такое эквивалент C ++ sprintf
?
Я знаю, что 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.