Maison > développement back-end > C++ > Pourquoi printf ne fonctionne-t-il pas directement avec std::string et quelles sont les alternatives ?

Pourquoi printf ne fonctionne-t-il pas directement avec std::string et quelles sont les alternatives ?

DDD
Libérer: 2024-12-18 13:31:10
original
233 Les gens l'ont consulté

Why Doesn't printf Work Directly with std::string, and What Are the Alternatives?

Comment utiliser printf avec std::string

Il est compréhensible d'être confus lors de l'utilisation de printf avec std::string, car il peut sembler qu'ils devraient travailler ensemble de manière transparente puisque la chaîne est membre de l'espace de noms std. Cependant, ce n'est pas le cas en raison de la nature non sécurisée de printf.

Printf utilise des arguments variables au sens C, ce qui signifie que vous pouvez transmettre n'importe quel nombre d'arguments, mais cela dépend de vous pour le lui dire. le nombre et les types de ces arguments. Dans le cas de printf, cela se fait via une chaîne avec des informations de type codées, telles que %d pour un int. Si vous mentez sur le type ou le nombre d'arguments, la fonction n'a aucun moyen standard de le savoir et présentera un comportement indéfini.

Avec std::string, qui est une construction C de type sécurisé, printf n'a aucune option pour cela, 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 souhaités.

Une solution simple à ce problème consiste à imprimer normalement en utilisant std::cout, puisque std::string prend en charge la surcharge d'opérateur pour cela. goal:

std::cout << "Follow this command: " << myString;
Copier après la connexion

Si vous devez extraire la chaîne de style C pour une raison quelconque, vous pouvez utiliser la méthode c_str() de std::string pour obtenir un const char * qui est terminé par un nul. Voici un exemple mis à jour utilisant c_str() :

printf("Follow this command: %s", myString.c_str()); // note the use of c_str
Copier après la connexion

Pour une fonction de type sécurisé qui se comporte de la même manière que printf, envisagez d'utiliser des modèles variadiques (introduits dans C 11). Vous pouvez en trouver un exemple [ici](https://en.cppreference.com/w/cpp/utility/variadic). De plus, Boost propose une bibliothèque potentiellement utile appelée boost::format.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal