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