c बूल के लिए printf प्रारूप निर्दिष्ट क्या है?




(7)

चूंकि एएनएसआई सी 99 _Bool माध्यम से stdbool.h या bool । लेकिन क्या बूल के लिए एक printf प्रारूप भी निर्दिष्ट है?

मेरा मतलब है कि छद्म कोड में कुछ ऐसा है:

bool x = true;
printf("%B\n", x);

जो प्रिंट करेगा:

true

आप नहीं कर सकते, लेकिन आप 0 या 1 प्रिंट कर सकते हैं

_Bool b = 1;
printf("%d\n", b);

source


बूल के लिए कोई प्रारूप विनिर्देशक नहीं है। आप अभिन्न प्रकारों को प्रिंट करने के लिए कुछ मौजूदा विनिर्देशकों का उपयोग करके इसे प्रिंट कर सकते हैं या कुछ और फैंसी कर सकते हैं:

 printf("%s", x?"true":"false");

नहीं है लेकिन चूंकि printf() s variadic तर्कों को पारित करते समय int से कम किसी भी अभिन्न प्रकार को int को बढ़ावा दिया जाता है, तो आप %d उपयोग कर सकते हैं:

bool x = true;
printf("%d\n", x); // prints 1

पर क्यों नहीं

printf(x ? "true" : "false");

या और अच्छा

printf("%s", x ? "true" : "false");

या इससे भी बेहतर

fputs(x ? "true" : "false", stdout);

बजाय?


यदि आप सी से बेहतर सी ++ पसंद करते हैं, तो आप इसे आजमा सकते हैं:

#include <ios>
#include <iostream>

bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;

itoa() की परंपरा में:

#define btoa(x) ((x)?"true":"false")

bool x = true;
printf("%s\n", btoa(x));

मैं सी में 'झूठी' या 'सच' के रूप में बूल के परिणाम को मुद्रित करने के सर्वोत्तम तरीके से एक उत्तर पसंद करता हूं ? , बिलकुल इसके जैसा

printf("%s\n", "false\0true"+6*x);
  • x == 0, "false \ 0true" + 0 "इसका अर्थ है" झूठा ";
  • x == 1, "false \ 0true" + 6 "इसका अर्थ है" सत्य ";

एएनएसआई सी 99 / सी 11 में bool लिए एक अतिरिक्त प्रिंटफ रूपांतरण विनिर्देश शामिल नहीं है।

लेकिन जीएनयू सी लाइब्रेरी कस्टम विनिर्देश जोड़ने के लिए एक एपीआई प्रदान करता है

एक उदाहरण:

#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;
}

चूंकि यह एक ग्लिब एक्सटेंशन है क्योंकि जीसीसी उस कस्टम विनिर्देशक के बारे में चेतावनी देता है:

$ 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]

आउटपुट:

$ ./main
The result is: false
(written 21 characters)
$ ./main 1
The result is: true
(written 20 characters)




printf