Я знаю, що std::coutце еквівалент C ++ printf.
Що таке еквівалент C ++ sprintf?
Я знаю, що std::coutце еквівалент C ++ 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 *використання&str[0] .
Було зазначено, що варіативні аргументи не повинні слідувати за передачею за посиланням, і c ++ добре не копіює рядки, якщо це не потрібно. У цьому випадку це виправляє.
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 .