Impression de valeurs booléennes en C++

Suraj P 12 octobre 2023
  1. Valeur booléenne comme vrai/faux en C++
  2. Modifiez le printf() en ajoutant une instruction ternaire pour imprimer des valeurs booléennes en C++
  3. Utilisez std::boolalpha dans cout pour imprimer des valeurs booléennes en C++
  4. Utilisez la facette personnalisée pour std::numpunc afin d’imprimer des valeurs booléennes en C++
  5. Conclusion
Impression de valeurs booléennes en C++

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.

Auteur: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub