Maison > développement back-end > C++ > Pourquoi `printf` provoque-t-il un comportement inattendu avec `std::string` et comment puis-je y remédier ?

Pourquoi `printf` provoque-t-il un comportement inattendu avec `std::string` et comment puis-je y remédier ?

DDD
Libérer: 2024-12-31 13:01:11
original
752 Les gens l'ont consulté

Why Does `printf` Cause Unexpected Behavior with `std::string`, and How Can I Fix It?

Comprendre l'utilisation de printf avec std::string

Bien que std::string soit membre de l'espace de noms std, tenter de l'utiliser avec printf entraîne des résultats inattendus comportement, comme le montre l'extrait de code suivant :

#include <iostream>
#include <string>

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);
    cin.get();

    return 0;
}
Copier après la connexion

Ce problème survient car printf n'est pas de type sécurisé et s'appuie sur des chaînes de style C. Pour résoudre ce problème, plusieurs approches sont disponibles :

Utilisation de std::cout

Étant donné que std::string prend en charge la surcharge des opérateurs, l'impression peut être simple avec std::cout:

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

Extraction d'une chaîne de style C

Si l'extraction d'une chaîne de style C est nécessaire, la méthode c_str() peut être utilisé pour obtenir un caractère const terminé par un caractère nul * :

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

Utilisation de modèles variadiques

Alternativement, les modèles variadiques peuvent fournir une alternative de type sécurisé à printf. Un exemple d'implémentation peut être trouvé ici : https://stackoverflow.com/a/15014001. Boost offre une fonctionnalité similaire avec boost::format.

Mise à jour C 23

C 23 introduit std::print, qui combine les atouts des deux approches, permettant sortie de type sécurisé utilisant std::format:

#include <print>

std::print("Follow this command: {}", myString);
Copier après la connexion

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!

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