Es wird kompiliert, weil printfes nicht typsicher ist, da es variable Argumente im C-Sinne 1 verwendet . printfhat keine Option für std::string, nur eine Zeichenfolge im C-Stil. Wenn Sie etwas anderes anstelle dessen verwenden, was erwartet wird, erhalten Sie definitiv nicht die gewünschten Ergebnisse. Es ist eigentlich undefiniertes Verhalten, also könnte überhaupt alles passieren.
Der einfachste Weg, dies zu beheben, da Sie C ++ verwenden, besteht darin, es normal zu drucken std::cout, da dies std::stringdurch Überladen von Operatoren unterstützt wird:
std::cout << "Follow this command: " << myString;
Wenn Sie aus irgendeinem Grund die Zeichenfolge im C-Stil extrahieren müssen, können Sie die c_str()Methode verwenden std::string, um eine Zeichenfolge zu erhalten const char *, die nullterminiert ist. Anhand Ihres Beispiels:
#include <iostream>
#include <string>
#include <stdio.h>
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.c_str()); //note the use of c_str
cin.get();
return 0;
}
Wenn Sie eine Funktion wünschen, die ähnlich ist printf, aber sicher eingibt, schauen Sie sich verschiedene Vorlagen an (C ++ 11, unterstützt von allen wichtigen Compilern ab MSVC12). Ein Beispiel dafür finden Sie hier . Es gibt nichts, von dem ich weiß, dass es so in der Standardbibliothek implementiert ist, aber es könnte speziell in Boost vorhanden sein boost::format.
[1]: Dies bedeutet, dass Sie eine beliebige Anzahl von Argumenten übergeben können. Die Funktion ist jedoch darauf angewiesen, dass Sie die Anzahl und den Typ dieser Argumente angeben. Im Fall von printfbedeutet dies eine Zeichenfolge mit codierten Typinformationen wie %dBedeutung int. Wenn Sie über den Typ oder die Nummer lügen, hat die Funktion keine Standardmethode, obwohl einige Compiler die Möglichkeit haben, zu überprüfen und Warnungen zu geben, wenn Sie lügen.