Obwohl std::string Mitglied des std-Namespace ist, führt der Versuch, es mit printf zu verwenden, zu unerwarteten Ergebnissen Verhalten, wie im folgenden Codeausschnitt zu sehen:
#include <iostream> #include <string> int main() { using namespace std; string myString = "Press ENTER to quit program!"; cout << "Come up and C++ me some time." << endl; printf("Follow this command: %s", myString); cin.get(); return 0; }
Dieses Problem tritt auf, weil printf nicht typsicher ist und basiert auf Strings im C-Stil. Um dieses Problem zu lösen, stehen mehrere Ansätze zur Verfügung:
Da std::string das Überladen von Operatoren unterstützt, kann das Drucken mit std::cout: unkompliziert erfolgen
std::cout << "Follow this command: " << myString;
Wenn das Extrahieren eines Strings im C-Stil erforderlich ist, kann dies mit der Methode c_str() erfolgen kann verwendet werden, um ein nullterminiertes const char * zu erhalten:
printf("Follow this command: %s", myString.c_str());
Alternativ können Variadic-Vorlagen eine typsichere Alternative zu printf bieten. Eine Beispielimplementierung finden Sie hier: https://stackoverflow.com/a/15014001. Boost bietet eine ähnliche Funktionalität mit boost::format.
C 23 Update
C 23 führt std::print ein, das die Stärken beider Ansätze vereint und so Folgendes ermöglicht Typsichere Ausgabe mit std::format:
#include <print> std::print("Follow this command: {}", myString);
Das obige ist der detaillierte Inhalt vonWarum verursacht „printf' unerwartetes Verhalten mit „std::string' und wie kann ich es beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!