Si sta compilando perché printf
non è sicuro, poiché utilizza argomenti variabili in senso C 1 . printf
non ha alcuna opzione per std::string
, solo una stringa in stile C. Usare qualcos'altro al posto di ciò che si aspetta sicuramente non ti darà i risultati desiderati. In realtà è un comportamento indefinito, quindi potrebbe succedere di tutto.
Il modo più semplice per risolvere questo problema, poiché stai usando C ++, è di stamparlo normalmente con std::cout
, poiché lo std::string
supporta attraverso il sovraccarico dell'operatore:
std::cout << "Follow this command: " << myString;
Se, per qualche motivo, è necessario estrarre la stringa in stile C, è possibile utilizzare il c_str()
metodo di std::string
per ottenere un valore const char *
che termina con null. Usando il tuo esempio:
#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;
}
Se si desidera una funzione simile printf
, ma digitare safe, esaminare i modelli variadic (C ++ 11, supportato su tutti i principali compilatori a partire da MSVC12). Puoi trovarne un esempio qui . Non c'è nulla che io sappia dell'implementazione del genere nella libreria standard, ma potrebbe esserci in Boost, in particolare boost::format
.
[1]: questo significa che puoi passare qualsiasi numero di argomenti, ma la funzione si affida a te per comunicargli il numero e il tipo di tali argomenti. Nel caso di printf
, ciò significa una stringa con informazioni di tipo codificate come %d
significato int
. Se menti del tipo o del numero, la funzione non ha un modo standard di sapere, anche se alcuni compilatori hanno la possibilità di controllare e dare avvisi quando menti.