बूल के लिए प्रिंटफ प्रारूप क्या है?


458

ANSI C99 के बाद से _Boolया के boolमाध्यम से है stdbool.h। लेकिन क्या printfबूल के लिए एक प्रारूप निर्दिष्ट है?

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

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

जो प्रिंट होगा:

true

1
आप इसे आगे की जानकारी के लिए पढ़ सकते हैं cplusplus.com/reference/cstdio/printf आप इसे हमेशा बना सकते हैं हालांकि!
वरवरिगोस इमैनुएल


3
@ बिलिंक, मेरा सवाल वास्तव में यह नहीं है कि बूल मूल्यों को प्रिंट करने का सबसे अच्छा तरीका क्या है - यह एक ठोस प्रिंटफ निर्दिष्ट के बारे में है। जिसका कोई अस्तित्व नहीं दिखता है। एक अच्छा जवाब देने के लिए एक और कोण होगा: शायद
प्रिंट

पर्याप्त रूप से उचित है, हालांकि मुझे वीटीसी को रद्द करने की क्षमता नहीं है, इसलिए मुझे अपने वोट के समाप्त होने का इंतजार करना होगा।
बिलिन्क

@maxschlepzig: समस्या को हल करने का एकमात्र तरीका प्रलेखन की जांच करना है। यदि आप GNU / Linux का उपयोग करते हैं (उदाहरण के लिए, चूंकि आपने हमें अपने सिस्टम के बारे में नहीं बताया था), तो आप [लिनक्स मैन पेज] (man7.org) पर अप-टू-डेट प्रिंटफ मैनुअल पढ़ सकते हैं। यदि आप "सच" / "गलत" स्ट्रिंग्स प्राप्त करना चाहते हैं, तो आप उन्हें मैन्युअल रूप से बना सकते हैं, यह बहुत आसान है।
एम।

जवाबों:


711

boolप्रकारों के लिए कोई प्रारूप निर्दिष्ट नहीं है । हालाँकि, जब से किसी भी अभिन्न प्रकार की तुलना intमें छोटे को बढ़ावा दिया जाता है, intजब printf()आप वैरिएबल तर्कों के लिए पास हो जाते हैं, तो आप इसका उपयोग कर सकते हैं %d:

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

पर क्यों नहीं:

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

या और अच्छा:

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

या, और भी बेहतर:

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

बजाय?


21
यदि आप गैर-सिंगल-स्ट्रिंग-शाब्दिक अभिव्यक्ति को प्रारूप स्ट्रिंग के रूप में निकालते हैं तो मैं इसे +1 करूंगा। इस तरह का उपयोग आसानी से असुरक्षित उपयोग में बदल जाता है। printf("%s", x ? "true" : "false");समस्या को ठीक करेगा।
आर .. गिटहब स्टॉप हेल्पिंग आईसीई

2
इस उत्तर के "क्यों नहीं" भाग के लिए - बूल के लिए एक प्रारूप विनिर्देशक प्रारूप स्ट्रिंग को डिजाइन के रूप में उपयोग करने की अनुमति देगा: शाब्दिक और मूल्यों के मिश्रण के साथ एक स्ट्रिंग के निर्माण के लिए।
noamtm

13
बस एक नोट के रूप में, मैं लेकर विवाद है कि की ओर जाते हैं होता printf("%s", x ? "true" : "false");है बेहतर है कि printf(x ? "true" : "false");- में आप कर रहे हैं कुल प्रारूप स्ट्रिंग यहाँ के नियंत्रण तो वहाँ है कोई खतरा यह है कि यह कुछ की तरह मिल जाएगा "%d"जो समस्याओं का कारण होगा। fputsदूसरी ओर, है एक बेहतर विकल्प।
paxdiablo

15
fputs"और भी बेहतर" क्यों है ? मैं हमेशा अपने सी को बेहतर बनाने के तरीकों की तलाश में हूं। इसके fputsबजाय मुझे किन परिस्थितियों में उपयोग करना चाहिए printf?
आर्क

10
@ Arc676, स्वरूपण के बिना एक स्ट्रिंग के लिए, प्रिंटफ़ की तुलना में फ़ुटप्स अधिक तेज़ और सरल है (जिसे स्ट्रिंग को फ़ॉर्मेट करने वाले चार्ट की तलाश में पार्स करना है)। केवल डालने के बजाय फ़ुटप्स (स्टडआउट) का उपयोग करना (जो स्टडआउट में चूक करता है) आउटपुट के लिए लागू होने वाली नई लाइन को समाप्त करता है।
चाड

45

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

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

कलाकारों की जरूरत नहीं है।

@ H2CO3 वैसे भी मैंने ओपी अनुरोधों के रूप में "सच" और "झूठे" समाधान का सुझाव दिया है। आपके द्वारा उल्लेखित हिस्से पर मैंने अपने शब्दों को थोड़ा बदल दिया है।
Ivaylo Strandjev 20

5
@IvayloStrandjev: हाँ, वहाँ है एक bool- C99 भाषा विशेष का यह भाग सी में प्रकार, बस में नहीं C89 संस्करण। एक नया कीवर्ड है _Bool, और यदि आप इसमें शामिल हैं <stdbool.h>, तो boolइसका एक पर्याय है _Bool
एडम रोसेनफील्ड

30

ANSI C99 / C11 में एक अतिरिक्त प्रिंटफ़ रूपांतरण विनिर्देशक शामिल नहीं है bool

लेकिन GNU C लाइब्रेरी कस्टम स्पेसिफ़ायर जोड़ने के लिए एक API प्रदान करता है

एक उदाहरण:

#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 -all -g main.c -o main
main.c: फ़ंक्शन में 'main':
main.c: 34: 3: चेतावनी: प्रारूप में अज्ञात रूपांतरण प्रकार के चरित्र 'B' [-रूपत =]
   r = printf ("परिणाम है:% B \ n", b);
   ^
main.c: 34: 3: चेतावनी: प्रारूप के लिए बहुत सारे तर्क [-रूपत-अतिरिक्त-आर्ग]

आउटपुट:

$ ./main
परिणाम है: असत्य
(लिखित २१ अक्षर)
$ ./main 1
परिणाम है: सच
(लिखित 20 पात्र)

12

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

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

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

5
btoaगैर-मानक जावास्क्रिप्ट (गेको और वेबिट) में "बाइनरी स्ट्रिंग टू बेस 64 स्ट्रिंग" है, इसलिए आप एक अलग नाम का उपयोग करना चाह सकते हैं।
पैन्ज़ी

26
@ पैनज़ी: मुझे यकीन नहीं है कि यह सी प्रोग्रामर के लिए गैर-मानक जावास्क्रिप्ट पहचानकर्ताओं के बारे में चिंता करने के प्रयास के लायक है।
कीथ थॉम्पसन

5
@KeithThompson मुझे लगता है कि मैंने सवालों को उलझा दिया और किसी तरह यह सोचा कि यह जावास्क्रिप्ट के बारे में था, जिसका कोई मतलब नहीं है। शायद देर रात थी।
पैन्जी

9
या, हमारे बीच अधिक कुटिल के लिए: "true\0false"[(!x)*5]:-)
paxdiablo

1
@MingDuck: हो सकता है !!x*5
jxh


2

यदि आप C ++ को C से बेहतर पसंद करते हैं, तो आप यह कोशिश कर सकते हैं:

#include <ios>
#include <iostream>

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

5
यह उत्तर ऑफ-टॉपिक है और इसे हटा दिया जाना चाहिए, क्योंकि यह प्रश्न में एक से दूसरी भाषा के बारे में है।
लंडिन

2
@ लुंडिन मैं असहमत हूं कि इसे हटा दिया जाना चाहिए। एसओ का लक्ष्य केवल एक व्यक्ति की मदद करना नहीं है, बल्कि सभी लोगों को एक ही सवाल पर मदद करना है। जब मैं स्प्रिंटफ बूलियन को सच्चे झूठे सी ++ के रूप में खोजता हूं , तो यह पहला पृष्ठ होता है जो आता है (हालांकि यकीनन यह पृष्ठ शीर्ष परिणाम हो सकता है यदि यह उत्तर मौजूद नहीं था)। चूंकि C ++ लगभग C का सुपरसेट है, मुझे नहीं लगता कि ऐसे उत्तरों को इतनी आसानी से छोड़ दिया जाना चाहिए। मुझ से +1।
जेफ जी

1
@ जेफ जी हां ऐसे उत्तर हटा दिए जाने चाहिए, हमारी बहुत स्पष्ट नीतियां हैं। सी और सी ++ टैग विकिस पढ़ें। यह प्रश्न विशेष रूप से C प्रोग्रामरों के लिए उपयोगी नहीं है क्योंकि C और C ++ बूलियन सिस्टम पूरी तरह से अलग हैं और यह प्रश्न C. टैग किया गया है। Google आपकी खोज में दो अनुगामी ++ को समझने में सक्षम नहीं है, इसलिए SO की समस्या नहीं है।
लंडिन

2
@ लुंडिन मेरी टिप्पणी का उद्देश्य एसओ की नीतियों पर टिप्पणी के रूप में व्याख्या करना नहीं था। यह वास्तव में एक टिप्पणी थी कि क्या यह उत्तर रचनात्मक रूप से प्रश्न को जोड़ता है। इस उत्तर को तुरंत C ++ - केवल के रूप में पहचाना जा सकता है। सी-ओनली उत्तर के लिए यहां कोई भी नहीं आ रहा है, यह सोचकर कि यह सी में काम करेगा और इसे बर्बाद करने की कोशिश कर रहा है। हालांकि, यह सी ++ के लिए एक शानदार जवाब है। यदि उत्तर उपयोगी होते हैं, भले ही वे ओपी की मदद न करें, तो क्या उन्हें नहीं रखा जाना चाहिए? मुझे लगता है कि रचनात्मक जवाब जो स्पष्ट रूप से पहचाने गए कैविएट को हटाए जाने चाहिए, नीति की परवाह किए बिना।
जेफ जी

1
@JeffG आप इसे meta.stackoverflow.com पर ला सकते हैं , यह चर्चा करने का स्थान नहीं है।
लंडिन

2

मेरे द्वारा उपयोग किए गए बूलियन मूल्य के आधार पर सिर्फ 1 या 0 प्रिंट करने के लिए:

printf("%d\n", !!(42));

विशेष रूप से झंडे के साथ उपयोगी:

#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));

खबरदार है कि !!दूर अनुकूलित हो सकता है
ragerdl

1

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

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

21
यह पूरी तरह से समझ से बाहर है। इससे पहले कि मैं "false\0true"+6*xवास्तव में क्या किया है यह पता लगाने में मुझे अच्छा लगा । यदि आप अन्य लोगों के साथ एक परियोजना में काम करते हैं, या सिर्फ एक परियोजना में एक कोडबेस को सफेद करते हैं जिसे आप एक्स साल बाद समझना चाहते हैं , तो इस तरह के निर्माण से बचना है।
हेलुगुदेबी

3
हालांकि मैं देखता हूं कि यह शाखा-कम होने के बाद से अधिक अनुकूलित हो सकता है। यदि गति आपकी चिंता है, तो यह एक विकल्प हो सकता है, बस एक टिप्पणी में अच्छी तरह से चाल के पीछे यांत्रिकी की व्याख्या करना सुनिश्चित करें। स्व-दस्तावेजी नाम के साथ एक इनलाइन फ़ंक्शन या मैक्रो भी सहायक होगा (लेकिन शायद इस मामले में पर्याप्त नहीं है)।
हेलुगुदेबी

3
साथ ही पठनीयता के बारे में चिंताओं को ध्यान में रखा जाता है कि अगर किसी को 0 या 1. के अलावा किसी अन्य मूल्य में गुजरता है तो यह झटका होगा
14

2
@plugwash आप निश्चित रूप से इसे बदल सकते हैं printf("%s\n","false\0true"+6*(x?1:0));जो केवल ... 5% कम पठनीय है।
होवसीयरई

static inline char const *bool2str(_Bool b) { return "false\0true"+6*x; } int main(void) { printf("%s != %s", bool2str(false), bool2str(true)); return 0; } साथ ही static inline char decimal2char(int d) { assert(d >= 0 && d <= 9); return '0' + d; }; बस इसे वर्णनात्मक रूप से नामित फ़ंक्शन में लपेटें और इसकी पठनीयता के बारे में चिंता न करें।
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.