ANSI C99/C11 n'incluent pas un spécificateur de conversion printf supplémentaire pour bool
.
Mais le La bibliothèque GNU C fournit une API pour ajouter des spécificateurs personnalisés. .
Un exemple :
#include <stdio.h>
#include <printf.h>
#include <stdbool.h>
static int bool_arginfo(const struct printf_info *info, size_t n,
int *argtypes, int *size)
{
if (n) {
argtypes[0] = PA_INT;
*size = sizeof(bool);
}
return 1;
}
static int bool_printf(FILE *stream, const struct printf_info *info,
const void *const *args)
{
bool b = *(const bool*)(args[0]);
int r = fputs(b ? "true" : "false", stream);
return r == EOF ? -1 : (b ? 4 : 5);
}
static int setup_bool_specifier()
{
int r = register_printf_specifier('B', bool_printf, bool_arginfo);
return r;
}
int main(int argc, char **argv)
{
int r = setup_bool_specifier();
if (r) return 1;
bool b = argc > 1;
r = printf("The result is: %B\n", b);
printf("(written %d characters)\n", r);
return 0;
}
Comme il s'agit d'une extension de la glibc, la GCC émet un avertissement à propos de ce spécificateur personnalisé :
$ gcc -Wall -g main.c -o main
main.c: In function ‘main’:
main.c:34:3: warning: unknown conversion type character ‘B’ in format \[-Wformat=\]
r = printf("The result is: %B\\n", b);
^
main.c:34:3: warning: too many arguments for format \[-Wformat-extra-args\]
Sortie :
$ ./main
The result is: false
(written 21 characters)
$ ./main 1
The result is: true
(written 20 characters)
1 votes
Vous pouvez lire ceci pour plus d'informations cplusplus.com/reference/cstdio/printf Mais vous pouvez toujours le faire !
0 votes
Duplicata possible de La meilleure façon d'imprimer le résultat d'un bool comme 'false' ou 'true' en C ?
3 votes
@billinkc, ma question n'est pas vraiment à propos de quoi le meilleur moyen est d'imprimer des valeurs de bools - il s'agit d'un spécificateur printf concret. Qui ne semble pas exister. Un autre angle pour une bonne réponse serait : peut-être qu'il y a un moyen d'ajouter un spécificateur de format personnalisé à printf qui fait la conversion bool ...
0 votes
C'est juste, bien que je ne semble pas avoir la capacité d'annuler le VtC donc je vais devoir attendre que mon vote expire.
0 votes
@maxschlepzig : la seule façon de résoudre le problème est de vérifier la documentation. Si vous utilisez GNU/Linux (à titre d'exemple, puisque vous ne nous avez pas parlé de votre système), vous pouvez lire un manuel printf à jour sur [Linux man pages](man7.org). Si vous voulez faire imprimer des chaînes "true"/"false", vous pouvez les construire manuellement, c'est assez facile.