Я знаю, что 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.