C'est peut-être une question stupide, mais y a-t-il un moyen de convertir une valeur booléenne en une chaîne telle que 1 devienne «vrai» et 0 devienne «faux»? Je pourrais simplement utiliser une instruction if, mais ce serait bien de savoir s'il existe un moyen de le faire avec le langage ou les bibliothèques standard. De plus, je suis un pédant. :)
93
Réponses:
Que diriez-vous d'utiliser le langage C ++ lui-même?
METTRE À JOUR:
Si vous voulez plus de 4 lignes de code sans aucune sortie de console, veuillez vous rendre sur la page de cppreference.com qui en parle
std::boolalpha
etstd::noboolalpha
qui vous montre la sortie de la console et en explique plus sur l'API.En outre, l'utilisation de
std::boolalpha
modifiera l'état global destd::cout
, vous souhaiterez peut-être restaurer le comportement d'origine, cliquez ici pour plus d'informations sur la restauration de l'état destd::cout
.la source
std::string str
et enregistrez-y le résultat de la conversion, si vous le pouvez.Nous parlons de C ++, non? Pourquoi diable utilisons-nous encore des macros !?
Les fonctions en ligne C ++ vous donnent la même vitesse qu'une macro, avec l'avantage supplémentaire de la sécurité de type et de l'évaluation des paramètres (ce qui évite le problème mentionné par Rodney et dwj.
En dehors de cela, j'ai quelques autres reproches, en particulier avec la réponse acceptée :)
À votre santé :)
@DrPizza: Inclure toute une bibliothèque boost pour une fonction aussi simple? Tu plaisantes?
la source
string
si les constantes de chaîne pour "true" et "false" sont stockées dans des variables const statiques.cout << (bool_x ? "true": "false") << endl;
C ++ a des chaînes appropriées, vous pouvez donc aussi bien les utiliser. Ils sont dans la chaîne d'en-tête standard. #include <string> pour les utiliser. Plus de dépassements de tampon strcat / strcpy; plus de terminateurs nuls manquants; plus de gestion manuelle de la mémoire désordonnée; chaînes comptées correctement avec une sémantique de valeur appropriée.
C ++ a également la capacité de convertir des booléens en représentations lisibles par l'homme. Nous avons vu des indices plus tôt avec les exemples iostream, mais ils sont un peu limités car ils ne peuvent envoyer le texte que vers la console (ou avec fstreams, un fichier). Heureusement, les concepteurs de C ++ n'étaient pas des idiots complets; nous avons également des iostreams qui ne sont pas sauvegardés par la console ou un fichier, mais par un tampon de chaîne géré automatiquement. Ils sont appelés stringstreams. #include <sstream> pour les obtenir. Alors on peut dire:
Bien sûr, nous ne voulons pas vraiment taper tout cela. Heureusement, C ++ dispose également d'une bibliothèque tierce pratique nommée Boost qui peut nous aider ici. Boost a une fonction intéressante appelée lexical_cast. On peut l'utiliser ainsi:
Maintenant, il est vrai de dire que c'est une surcharge plus élevée que certaines macro; Les chaînes de caractères traitent des paramètres régionaux dont vous ne vous souciez peut-être pas et créent une chaîne dynamique (avec allocation de mémoire) alors que la macro peut produire une chaîne littérale, ce qui évite cela. Mais d'un autre côté, la méthode stringstream peut être utilisée pour un grand nombre de conversions entre les représentations imprimables et internes. Vous pouvez les exécuter à l'envers; boost :: lexical_cast <bool> ("true") fait la bonne chose, par exemple. Vous pouvez les utiliser avec des nombres et en fait n'importe quel type avec les bons opérateurs d'E / S formatés. Ils sont donc assez polyvalents et utiles.
Et si après tout cela, votre profilage et votre benchmarking révèlent que les lexical_casts sont un goulot d'étranglement inacceptable, c'est à ce moment que vous devriez envisager de faire de l'horreur macro.
la source
Cela devrait être bien:
Mais, si vous voulez le faire plus C ++ - ish:
la source
Si vous décidez d'utiliser des macros (ou si vous utilisez C sur un futur projet), vous devez ajouter des parenthèses autour du `` b '' dans l'expansion de la macro (je n'ai pas encore assez de points pour modifier le contenu des autres):
Il s'agit d'une technique de programmation défensive qui protège contre les erreurs cachées d'ordre des opérations; c'est-à-dire, comment cela évalue-t-il pour tous les compilateurs?
par rapport à
la source
J'utilise un ternaire dans un printf comme ceci:
Si vous le macro:
alors vous devez vous assurer que tout ce que vous transmettez
'b'
n'a pas d'effets secondaires. Et n'oubliez pas les crochets autour du'b'
car vous pourriez obtenir des erreurs de compilation.la source
Avec C ++ 11, vous pouvez utiliser un lambda pour obtenir un code légèrement plus compact et une utilisation sur place:
Impressions:
la source
Cet article est ancien mais vous pouvez maintenant l'utiliser
std::to_string
pour convertir beaucoup de variables enstd::string
.http://en.cppreference.com/w/cpp/string/basic_string/to_string
la source
Sans y faire glisser ostream:
la source
Utilisez
boolalpha
pour imprimer booléen en chaîne.Référence C ++
la source
Que diriez-vous du simple:
la source
Je suis d'accord qu'une macro pourrait être la meilleure solution. Je viens de créer un cas de test (croyez-moi, je ne suis pas bon avec C / C ++ mais cela semblait amusant):
la source
Tant que les chaînes peuvent être vues directement comme un tableau de caractères, il sera vraiment difficile de me convaincre que les
std::string
chaînes représentent des citoyens de première classe en C ++.De plus, combiner allocation et délimitation me semble de toute façon être une mauvaise idée.
la source
Essayez cette macro. Partout où vous voulez que "true" ou false apparaisse, remplacez-le simplement par PRINTBOOL (var) où var est le booléen pour lequel vous voulez le texte.
la source