Подтвердить что ты не робот

C++ эквивалент sprintf?

Я знаю, что std::cout является эквивалентом С++ printf.

Что такое эквивалент С++ для sprintf?

4b9b3361

Ответ 1

std::ostringstream

Пример:

#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

Ответ 2

Обновление, август 2019 г.:

Похоже, что С++ 20 будет иметь std::format. Ссылочная реализация - {fmt}. Если вы ищете альтернативу printf() сейчас, это станет новым "стандартным" подходом и заслуживает рассмотрения.

Оригинал:

Используйте Boost.Format. Он имеет синтаксис printf -like, безопасность типов, результаты std::string и множество других интересных вещей. Ты не вернешься.

Ответ 3

sprintf отлично работает на С++.

Ответ 4

Вы можете использовать заголовочный файл iomanip для форматирования выходного потока. Проверьте этот!

Ответ 5

Здесь хорошая функция для С++ 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].

Ответ 6

Используйте поток строк для достижения такого же эффекта. Кроме того, вы можете включить <cstdio> и использовать snprintf.

Ответ 7

В зависимости от того, что именно вы планируете использовать в 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().