Il est compilé car il printf
n'est pas de type sûr, car il utilise des arguments variables au sens C 1 . printf
n'a pas d'option pour std::string
, seulement une chaîne de style C. Utiliser autre chose à la place de ce à quoi il s'attend ne vous donnera certainement pas les résultats que vous souhaitez. C'est en fait un comportement indéfini, donc tout peut arriver.
Le moyen le plus simple de résoudre ce problème, puisque vous utilisez C ++, est de l'imprimer normalement avec std::cout
, car le std::string
prend en charge via la surcharge d'opérateurs:
std::cout << "Follow this command: " << myString;
Si, pour une raison quelconque, vous devez extraire la chaîne de style C, vous pouvez utiliser la c_str()
méthode de std::string
pour obtenir une const char *
terminaison par null. En utilisant votre exemple:
#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;
}
Si vous voulez une fonction similaire printf
, mais de type sûr, regardez dans les modèles variadiques (C ++ 11, pris en charge sur tous les principaux compilateurs à partir de MSVC12). Vous pouvez en trouver un exemple ici . Il n'y a rien que je sache d'implémentation comme ça dans la bibliothèque standard, mais il pourrait y en avoir dans Boost, en particulier boost::format
.
[1]: Cela signifie que vous pouvez passer n'importe quel nombre d'arguments, mais la fonction compte sur vous pour lui indiquer le nombre et les types de ces arguments. Dans le cas de printf
, cela signifie une chaîne avec des informations de type codées comme la %d
signification int
. Si vous mentez sur le type ou le nombre, la fonction n'a aucun moyen standard de le savoir, bien que certains compilateurs aient la capacité de vérifier et d'avertir lorsque vous mentez.