Mise à jour C++23
Nous disposons enfin de std::print
comme moyen d'utiliser std::format
pour une sortie directe :
#include
#include
int main() {
// ...
std::print("Suivez cette commande : {}", myString);
// ...
}
Cela combine le meilleur des deux approches.
Réponse originale
Cela compile car printf
n'est pas sûr rapports aux types, car il utilise des arguments variables dans le sens C1. printf
n'a pas d'option pour std::string
, seulement une chaîne de style C. Utiliser quelque chose d'autre à la place de ce qu'il attend ne vous donnera définitivement pas les résultats souhaités. C'est en fait un comportement indéfini, donc n'importe quelle chose pourrait se produire.
La manière la plus simple de corriger ceci, puisque vous utilisez du C++, est de l'afficher normalement avec std::cout
, car std::string
prend en charge cela via la surcharge d'opérateur :
std::cout << "Suivez cette commande : " << myString;
Si, pour une raison quelconque, vous devez extraire la chaîne de style C, vous pouvez utiliser la méthode c_str()
de std::string
pour obtenir un const char *
qui est null-terminée. En utilisant votre exemple :
#include
#include
#include
int main()
{
using namespace std;
string myString = "Appuyez sur ENTREE pour quitter le programme!";
cout << "Venez me voir en C++ à l'occasion." << endl;
printf("Suivez cette commande : %s", myString.c_str()); //notez l'utilisation de c_str
cin.get();
return 0;
}
Si vous souhaitez une fonction similaire à printf
, mais sûr au niveau des types, regardez du côté des modèles variadiques (C++11, pris en charge par tous les principaux compilateurs à partir de MSVC12). Vous pouvez trouver un exemple d'une telle fonction ici. Rien de ce que je connais n'est implémenté de cette manière dans la bibliothèque standard, mais il pourrait y en avoir dans Boost, spécifiquement boost::format
.
[1] : Cela signifie que vous pouvez passer n'importe quel nombre d'arguments, mais la fonction a besoin que vous lui indiquiez le nombre et les types de ces arguments. Dans le cas de printf
, cela signifie une chaîne avec des informations de type encodées comme %d
signifiant int
. Si vous mentez sur le type ou le nombre, la fonction n'a pas de moyen standard de le savoir, bien que certains compilateurs aient la capacité de vérifier et de donner des avertissements lorsque vous mentez.
8 votes
Juste pour que vous le sachiez, beaucoup de gens critiquent ce livre. Ce que je peux comprendre, car il n'y a pas grand-chose sur la programmation orientée objet, mais je ne pense pas que ce soit aussi mauvais que ce que les gens prétendent.
0 votes
Ouf! eh bien, c'est bon de garder cela à l'esprit pendant que je parcours le livre. Je suis sûr que ce ne sera pas le seul livre en C++ que je lirai au cours de l'année prochaine ou plus, donc j'espère qu'il ne fera pas trop de dégâts :)
0 votes
En utilisant le niveau d'avertissement le plus élevé du compilateur répondrait à votre question - lors de la compilation avec gcc. Comment MSVC gère cela - je ne sais pas.