Wiem, że std::cout
jest to odpowiednik C ++ printf
.
Jaki jest odpowiednik C ++ sprintf
?
Wiem, że std::cout
jest to odpowiednik C ++ printf
.
Jaki jest odpowiednik C ++ sprintf
?
Odpowiedzi:
Przykład:
#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;
}
Wynik:
name: nemo, age: 1000
sprintf (...)
? Nie możesz sformatować danych w dowolny sposób, musisz polegać na znanym typie, gdy wprowadzasz je do strumienia za pomocą <<
operatora.
Aktualizacja, sierpień 2019:
Wygląda na to, że C ++ 20 będzie mieć std::format
. Implementacja referencyjna to {fmt} . Jeśli teraz szukasz printf()
alternatywy, stanie się to nowym „standardowym” podejściem i warto je rozważyć.
Oryginalny:
Użyj Boost.Format . Ma printf
składnię podobną do tej, bezpieczeństwo typów, std::string
wyniki i wiele innych przydatnych rzeczy. Nie wrócisz.
sprintf działa dobrze w C ++.
Możesz użyć pliku nagłówkowego iomanip do sformatowania strumienia wyjściowego. Sprawdź to !
Oto fajna funkcja dla sprintów w języku c ++. Strumienie mogą stać się brzydkie, jeśli używasz ich zbyt intensywnie.
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;
}
}
W C ++ 11 i nowszych wersjach std :: string gwarantuje użycie ciągłego magazynu, który kończy się na '\0'
, więc dozwolone jest rzutowanie go na char *
using &str[0]
.
Zwrócono uwagę, że argumenty wariadyczne nie powinny następować po przekazaniu przez referencję, a c ++ jest dobry w nie kopiowaniu łańcuchów, jeśli nie musi. W takim przypadku to rozwiązuje problem.
std::string string_format(std::string fmt, ...) {
sprintf
-usage.
(char*) str.c_str()
odrzuca const
.
W zależności od tego, co dokładnie planujesz sprintf()
, std::to_string()
może być przydatne i bardziej idiomatyczne niż inne opcje:
void say(const std::string& message) {
// ...
}
int main() {
say(std::to_string(5));
say("Which is to say " + std::to_string(5) + " words");
}
Główną zaletą std::to_string()
IMHO jest to, że można go łatwo rozszerzyć, aby obsługiwał dodatkowe typy, które sprintf()
nawet nie mogą marzyć o ciągnieniu - coś w rodzaju Object.toString()
metody Java .
Użyj stringstream, aby osiągnąć ten sam efekt. Możesz także dołączyć <cstdio>
i nadal używać snprintf.