Ich weiß, dass dies std::cout
das C ++ - Äquivalent von ist printf
.
Was ist das C ++ - Äquivalent sprintf
?
Ich weiß, dass dies std::cout
das C ++ - Äquivalent von ist printf
.
Was ist das C ++ - Äquivalent sprintf
?
Antworten:
Beispiel:
#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;
}
Ausgabe:
name: nemo, age: 1000
sprintf (...)
? Sie können die Daten nicht willkürlich formatieren. Sie müssen sich darauf verlassen, dass der Typ bekannt ist, wenn Sie ihn mit dem <<
Operator in den Stream einspeisen.
Update, August 2019:
Es sieht so aus, als hätte C ++ 20 std::format
. Die Referenzimplementierung ist {fmt} . Wenn Sie printf()
jetzt nach einer Alternative suchen , wird dies zum neuen "Standard" -Ansatz und ist eine Überlegung wert.
Original:
Verwenden Sie Boost.Format . Es hat eine printf
ähnliche Syntax, Typensicherheit, std::string
Ergebnisse und viele andere nützliche Dinge. Du wirst nicht zurück gehen.
sprintf funktioniert gut in C ++.
Sie können die iomanip-Headerdatei verwenden, um den Ausgabestream zu formatieren. Überprüfen Sie dies !
Hier ist eine nette Funktion für einen C ++ Sprintf. Streams können hässlich werden, wenn Sie sie zu stark verwenden.
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;
}
}
In C ++ 11 und höher wird garantiert, dass std :: string zusammenhängenden Speicher verwendet, der mit endet. Daher ist '\0'
es legal, ihn in char *
using umzuwandeln &str[0]
.
Es wurde darauf hingewiesen, dass verschiedene Argumente nicht der Referenzübergabe folgen sollen, und c ++ ist gut darin, Zeichenfolgen nicht zu kopieren, wenn dies nicht erforderlich ist. In diesem Fall wird das Problem behoben.
std::string string_format(std::string fmt, ...) {
sprintf
anzupassen.
(char*) str.c_str()
wirft weg const
.
Verwenden Sie einen Stringstream, um den gleichen Effekt zu erzielen. Sie können auch <cstdio>
snprintf einschließen und weiterhin verwenden.
Je nachdem, was genau Sie planen sprintf()
, std::to_string()
kann dies nützlich und idiomatischer sein als andere Optionen:
void say(const std::string& message) {
// ...
}
int main() {
say(std::to_string(5));
say("Which is to say " + std::to_string(5) + " words");
}
Der Hauptvorteil von std::to_string()
IMHO ist, dass es einfach erweitert werden kann, um zusätzliche Typen zu unterstützen, sprintf()
die nicht einmal von Stringing träumen können - ähnlich wie bei Java Object.toString()
.