Heim >Backend-Entwicklung >C++ >Warum funktioniert printf nicht direkt mit std::string und welche Alternativen gibt es?

Warum funktioniert printf nicht direkt mit std::string und welche Alternativen gibt es?

DDD
DDDOriginal
2024-12-18 13:31:10233Durchsuche

Why Doesn't printf Work Directly with std::string, and What Are the Alternatives?

So verwenden Sie printf mit std::string

Es ist verständlich, verwirrt zu sein, wenn printf mit std::string verwendet wird Es scheint, als ob sie nahtlos zusammenarbeiten sollten, da string ein Mitglied des std-Namespace ist. Dies ist jedoch aufgrund der typunsicheren Natur von printf nicht der Fall.

Printf verwendet variable Argumente im C-Sinn, was bedeutet, dass Sie eine beliebige Anzahl von Argumenten übergeben können, es aber darauf angewiesen ist, dass Sie es mitteilen die Anzahl und Art dieser Argumente. Im Fall von printf erfolgt dies über einen String mit codierten Typinformationen, z. B. %d für einen int. Wenn Sie über den Typ oder die Anzahl der Argumente lügen, verfügt die Funktion über keine Standardmethode zur Erkennung und zeigt undefiniertes Verhalten.

Mit std::string, einem typsicheren C-Konstrukt, hat printf keine Option dafür nur eine Zeichenfolge im C-Stil. Wenn Sie anstelle des erwarteten etwas anderes verwenden, erhalten Sie sicherlich nicht die gewünschten Ergebnisse.

Eine einfache Lösung für dieses Problem besteht darin, normal mit std::cout zu drucken, da std::string hierfür die Operatorüberladung unterstützt Zweck:

std::cout << "Follow this command: " << myString;

Wenn Sie aus irgendeinem Grund den C-Stil-String extrahieren müssen, können Sie die c_str()-Methode von std::string verwenden, um ein const char * zu erhalten nullterminiert. Hier ist ein aktualisiertes Beispiel mit c_str():

printf("Follow this command: %s", myString.c_str()); // note the use of c_str

Für eine typsichere Funktion, die sich ähnlich wie printf verhält, sollten Sie die Verwendung von Variadic-Vorlagen (eingeführt in C 11) in Betracht ziehen. Ein Beispiel dafür finden Sie [hier](https://en.cppreference.com/w/cpp/utility/variadic). Darüber hinaus bietet Boost eine potenziell nützliche Bibliothek namens boost::format.

Das obige ist der detaillierte Inhalt vonWarum funktioniert printf nicht direkt mit std::string und welche Alternativen gibt es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn