Impression de valeurs booléennes en C++
- Valeur booléenne comme vrai/faux en C++
-
Modifiez le
printf()
en ajoutant une instruction ternaire pour imprimer des valeurs booléennes en C++ -
Utilisez
std::boolalpha
danscout
pour imprimer des valeurs booléennes en C++ -
Utilisez la facette personnalisée pour
std::numpunc
afin d’imprimer des valeurs booléennes en C++ - Conclusion
Lorsque nous essayons d’imprimer des valeurs booléennes en C++, elles sont soit imprimées comme 0
ou 1
par std::cout
, mais parfois il est préférable de voir la sortie sous la forme de true
ou false
. Cet article traite de la manière d’imprimer des valeurs booléennes sous forme de texte en C++.
Valeur booléenne comme vrai/faux en C++
Supposons un scénario où nous lisons des lignes et des lignes de code et des fichiers journaux pendant le débogage, et maintenant il est très facile de manquer un 0
ou un 1
au milieu d’une mer d’erreurs et de chiffres. Il est donc préférable d’avoir la valeur booléenne imprimée comme true/false
.
Nous verrons trois manières différentes d’y parvenir.
Modifiez le printf()
en ajoutant une instruction ternaire pour imprimer des valeurs booléennes en C++
Le plus simple est de faire une légère modification dans printf()
qui peut afficher true
ou false
. Lors de l’impression bool en utilisant printf()
, nous devons utiliser le format %d
car il n’y a pas de paramètre spécifique pour les valeurs bool.
Comme bool est plus court que int
, il est promu en int
lorsqu’il est passé dans l’instruction printf()
. Mais cela imprime les bons vieux 0
et 1
, donc nous modifions en ajoutant l’instruction ternaire if-statement
et en changeant le spécificateur de format en %s
, et nous obtenons notre true
ou false
désiré sur la sortie.
Exemple de code :
#include <iostream>
using namespace std;
int main() {
printf("boolean true: %d\n", true);
printf("boolean false: %d\n", false);
// modified printf()
printf("boolean true: %s\n", true ? "true" : "false");
printf("boolean false: %s\n", false ? "true" : "false");
}
Production:
boolean true: 1
boolean false: 0
boolean true: true
boolean false: false
Le problème avec cette méthode est que lorsque les fichiers de code source deviennent volumineux et complexes, cela entrave la lisibilité.
Utilisez std::boolalpha
dans cout
pour imprimer des valeurs booléennes en C++
std::boolalpha
se trouve dans le fichier d’en-tête <iomanip>
et fonctionne avec les fonctions de flux d’entrée et de sortie. Les flux standard ont un drapeau boolalpha
qui détermine ce qui est imprimé à l’écran.
S’il est défini sur true
, il affiche la forme textuelle des valeurs booléennes, c’est-à-dire true
ou false
, mais lorsqu’il est défini sur false
, nous obtenons une sortie bool sous la forme 0
et 1
uniquement.
Exemple:
#include <iostream>
using namespace std;
int main() {
cout << "when boolalpha flag is off\n";
cout << "true: " << true << endl;
cout << "false: " << false << endl;
cout << "when boolalpha flag is on\n";
cout << boolalpha << "true: " << true << endl;
cout << boolalpha << "false: " << false << endl;
cout << noboolalpha;
}
Production:
when boolalpha flag is off
true: 1
false: 0
when boolalpha flag is on
true: true
false: false
std::boolalpha
est l’un des meilleurs moyens d’afficher true
ou false
en sortie, mais il présente quelques inconvénients. Tout d’abord, nous devons désactiver le drapeau boolalpha
après l’avoir utilisé via std::noboolalpha
.
Un autre problème est que si nous voulons coder en japonais ou dans une autre langue, et que nous voulons que "hai"
(vrai en japonais) ou "nai"
(faux en japonais) soit imprimé au lieu de true
ou false
, ou si nous voulons mettre les mots en majuscules comme True
ou False
, nous ne pouvons pas faire tout cela en utilisant std::boolalpha
seul.
Utilisez la facette personnalisée pour std::numpunc
afin d’imprimer des valeurs booléennes en C++
Comme mentionné dans le paragraphe précédent, que se passe-t-il si nous voulons imprimer autre chose que true
ou false
ou une sortie en majuscule ou localisée. Cela peut être fait en utilisant une facette
personnalisée pour std::numpunct
.
Une facette
est une classe qui décrit l’ensemble de fonctionnalités locales associé à un aspect culturel spécifique. Les opérations d’entrée et de sortie de flux utilisent std::numpunct
à std::numget
et std::numput
pour analyser l’entrée numérique et formater la sortie numérique.
La facette
de std::numpunct
encapsule les préférences de ponctuation numérique. Nous pouvons spécifier nos propres chaînes de caractères que nous voulons retourner lorsque le drapeau std::boolalpha
est actif en surchargeant les fonctions do_truename()
et do_falsename()
présentes dans std::numpunct
.
Après cela, avec l’objet std::locale
avec l’utilisation de std::cout.imbue()
, nous pouvons remplacer la locale actuelle.
Exemple de code :
#include <ios>
#include <iostream>
#include <locale>
using namespace std;
class japanese_bool : public std::numpunct<char> {
protected:
std::string do_truename() const override { return "Hai"; }
std::string do_falsename() const override { return "NAI"; }
};
int main() {
cout.imbue(std::locale(std::locale(), new japanese_bool));
cout << std::boolalpha;
cout << "Japanese true : " << true << "\n";
cout << "Japanese false : " << false << "\n";
cout << noboolalpha;
}
Dans le code ci-dessus, new
n’est pas une fuite de mémoire, l’objet japanese_bool
est implicitement compté en référence, et lorsque le référencement std::locale
sort de la portée, il sera automatiquement détruit.
Production:
Japanese true : Hai
Japanese false : NAI
Conclusion
Cet article nous a enseigné différentes méthodes pour imprimer la sortie bool comme true
et false
. Les deux premières méthodes sont préférables si nous voulons une sortie true
ou false
, tandis que la troisième méthode est préférable lorsque nous voulons une sortie spécialisée au lieu de juste true ou false.