Es wird kompiliert, weil printf
es nicht typsicher ist, da es variable Argumente im C-Sinne 1 verwendet . printf
hat 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::string
durch Ü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 printf
bedeutet dies eine Zeichenfolge mit codierten Typinformationen wie %d
Bedeutung 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.