Heim >Backend-Entwicklung >C++ >Warum verursacht „printf' unerwartetes Verhalten mit „std::string' und wie kann ich es beheben?

Warum verursacht „printf' unerwartetes Verhalten mit „std::string' und wie kann ich es beheben?

DDD
DDDOriginal
2024-12-31 13:01:11728Durchsuche

Why Does `printf` Cause Unexpected Behavior with `std::string`, and How Can I Fix It?

Verstehen der Verwendung von printf mit std::string

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:

Verwendung von std::cout

Da std::string das Überladen von Operatoren unterstützt, kann das Drucken mit std::cout: unkompliziert erfolgen

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

String im C-Stil extrahieren

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());

Verwendung von Variadic-Vorlagen

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!

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