বুলের জন্য প্রিন্টফ ফর্ম্যাট নির্দিষ্টকরণকারী কী?


456

এএনএসআই সি 99 যেহেতু রয়েছে _Boolবা এর boolমাধ্যমে রয়েছে stdbool.h। তবে printfবুলের জন্য কি এখানে কোনও ফর্ম্যাট স্পেসিফায়ার রয়েছে?

আমি সেই সিউডো কোডটির মতো কিছু বোঝাতে চাইছি:

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

যা মুদ্রণ করবে:

true

1
আপনি আরও তথ্যের জন্য এটি পড়তে পারেন cplusplus.com/references/cstdio/printf আপনি সর্বদা এটি তৈরি করতে পারেন যদিও!
ভার্ভারিগোস এমানোইল


3
@ বিলিংক, আমার প্রশ্নটি হ'ল মূল মূল্যগুলি মুদ্রণের সর্বোত্তম উপায় কী - এটি একটি কংক্রিট প্রিন্টফ স্পেসিফায়ার সম্পর্কে। যার অস্তিত্ব মনে হয় না। একটি দুর্দান্ত উত্তরের আর একটি কোণ হতে পারে: সম্ভবত
মুদ্রণের

যথেষ্ট ন্যায্য, যদিও আমার কাছে ভিটিসি আনকাউন্ট করার ক্ষমতা নেই বলে মনে হচ্ছে সুতরাং আমার ভোটের মেয়াদ শেষ হওয়ার জন্য অপেক্ষা করতে হবে।
বিলিংক

@ ম্যাক্সচলেপজিগ: সমস্যা সমাধানের একমাত্র উপায় হ'ল ডকুমেন্টেশন চেক করা। আপনি যদি জিএনইউ / লিনাক্স ব্যবহার করেন (উদাহরণস্বরূপ, যেহেতু আপনি আপনার সিস্টেম সম্পর্কে আমাদের জানাননি), আপনি [লিনাক্স ম্যান পৃষ্ঠাগুলি] (man7.org) তে একটি আধুনিক তথ্য মুদ্রণ ম্যানুয়াল পড়তে পারেন। আপনি যদি "সত্য" / "মিথ্যা" স্ট্রিংগুলি মুদ্রিত করতে চান তবে আপনি সেগুলি নিজেই তৈরি করতে পারেন, এটি বেশ সহজ।
বুলাত এম।

উত্তর:


708

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);

পরিবর্তে?


20
আপনি যদি বিন্যাসের স্ট্রিং হিসাবে অ-একক-স্ট্রিং-আক্ষরিক অভিব্যক্তিটি থেকে মুক্তি পান তবে আমি এটি +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?
অর্ক 676

10
@ আরক 676, বিন্যাস ছাড়াই স্ট্রিংয়ের জন্য, fputs প্রিন্টফের চেয়ে দ্রুত এবং সহজ (যা ফরম্যাটিং অক্ষরের জন্য স্ট্রিংটিকে পার্স করতে হয়)। শুধু পুট () (যা স্টাডাউট ডিফল্ট) এর পরিবর্তে fputs (stdout) ব্যবহার করা আউটপুটে সংযোজন করা নিউলাইনটিকে সরিয়ে দেয়।
চাদ

45

বুলের জন্য কোনও বিন্যাস নির্দিষ্টকরণকারক নেই। ইন্টিগ্রাল টাইপ প্রিন্ট করার জন্য বিদ্যমান কয়েকটি স্পেসিফায়ার ব্যবহার করে আপনি এটি মুদ্রণ করতে পারেন বা আরও অভিনব কিছু করতে পারেন:

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

কাস্টের দরকার নেই is

@ H2CO3 যাইহোক আমি ওপি অনুরোধ হিসাবে সমাধান "সত্য" এবং "মিথ্যা" মুদ্রণের পরামর্শ দিয়েছি। আপনি যে অংশটি উল্লেখ করেছেন তাতে আমি আমার কথাটি কিছুটা পরিবর্তন করেছি।
Ivaylo স্ট্রান্ডজেভ

5
@IvayloStrandjev: হ্যাঁ, হয় একটি bool- C99 ভাষা বৈশিষ্ট তা অংশ সি টাইপ, শুধু নেই C89 সংস্করণ। এখানে একটি নতুন কীওয়ার্ড _Boolরয়েছে এবং আপনি যদি অন্তর্ভুক্ত করেন <stdbool.h>তবে এর boolপ্রতিশব্দ _Bool
অ্যাডাম রোজেনফিল্ড

30

এএনএসআই সি 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: ফাংশনে 'মেইন':
main.c: 34: 3: সতর্কতা: ফর্ম্যাটে অজানা রূপান্তর প্রকারের অক্ষর 'বি' [-ফর্ম্যাট =]
   আর = প্রিন্টফ ("ফলাফলটি:% বি \ n", খ);
   ^
main.c: 34: 3: সতর্কতা: বিন্যাসের জন্য অনেক বেশি আর্গুমেন্ট [-উপরেট-এক্সট্রা-আরগস]

আউটপুট:

/ ./main
ফলাফল: মিথ্যা
(21 অক্ষর লিখিত)
$ ./main 1
ফলাফল: সত্য
(20 টি অক্ষর লিখিত)

12

এর রীতিতে itoa():

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

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

5
btoaনন-স্ট্যান্ডার্ড জাভাস্ক্রিপ্টে (গেকো এবং ওয়েবকিট) "বাইনারি স্ট্রিং থেকে বেস 64 স্ট্রিং" হয়, সুতরাং আপনি অন্য কোনও নাম ব্যবহার করতে চাইতে পারেন।
পানজি

26
@ পাঞ্জি: আমি নিশ্চিত নই যে সি-প্রোগ্রামার অ-মানক জাভাস্ক্রিপ্ট শনাক্তকারীদের নিয়ে উদ্বেগ প্রকাশ করার জন্য এটি প্রচেষ্টা মূল্যবান।
কিথ থম্পসন

5
@ কিথথম্পসন আমার মনে হয় আমি প্রশ্নগুলিকে বিভ্রান্ত করেছিলাম এবং একরকম ভেবেছিলাম এটি জাভাস্ক্রিপ্ট সম্পর্কে, যা কোনওভাবেই বোঝা যায় না। সম্ভবত রাত হয়েছে।
পানজি

9
অথবা, আমাদের মধ্যে আরও বিভ্রান্তির জন্য: "true\0false"[(!x)*5]:-)
প্যাক্সডিয়াবলো

1
@MooingDuck: হয়তো !!x*5
jxh


2

আপনি যদি সি ++ সি এর চেয়ে ভাল পছন্দ করেন তবে আপনি এটি ব্যবহার করে দেখতে পারেন:

#include <ios>
#include <iostream>

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

5
এই উত্তরটি অফ-টপিক এবং মুছে ফেলা উচিত, যেহেতু এটি প্রশ্নটির চেয়ে অন্য ভাষা সম্পর্কে।
লন্ডিন

2
@ লন্ডিন আমি একমত নই যে এটি মুছে ফেলা উচিত। এসও এর লক্ষ্য কেবল একজনকে সহায়তা করা নয়, একই প্রশ্নে সমস্ত মানুষকে সহায়তা করা। আমি যখন স্প্রিন্টফ মুদ্রণ বুলিয়ানটি সত্য মিথ্যা সি ++ হিসাবে অনুসন্ধান করি তখন এটিই প্রথম পৃষ্ঠায় আসে (যদিও যুক্তিযুক্তভাবে এই উত্তরটি উপস্থিত না থাকলে এই পৃষ্ঠাটি শীর্ষ ফলাফল হতে পারে)। যেহেতু সি ++ প্রায় সি এর সুপারস্টার, তাই আমি মনে করি না যে এই জাতীয় উত্তরগুলি এত সহজে ফেলে দেওয়া উচিত। আমার কাছ থেকে +1
জেফ জি

1
@ জেফজি হ্যাঁ এই জাতীয় উত্তরগুলি মুছে ফেলা উচিত, আমাদের খুব সুস্পষ্ট নীতিমালা রয়েছে। সি এবং সি ++ ট্যাগ উইকিস পড়ুন। এই প্রশ্নটি সি প্রোগ্রামারদের পক্ষে বিশেষভাবে কার্যকর নয় কারণ সি এবং সি ++ বুলিয়ান সিস্টেমগুলি সম্পূর্ণ আলাদা এবং প্রশ্নটি সি ট্যাগ করা হয়েছে যে গুগল আপনার অনুসন্ধানে দুটি ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++> C C + + + + বুলিয়ান সিস্টেমগুলি সম্পূর্ণ আলাদা এবং প্রশ্নটি সি।
লন্ডিন

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, "false \ 0true" + 0 "এর অর্থ" মিথ্যা ";
  • x == 1, "মিথ্যা \ 0 ত্রুটি" + 6 "এর অর্থ" সত্য ";

21
এটি সম্পূর্ণ বোধগম্য। "false\0true"+6*xসত্যিই কী করেছে তা অনুধাবন করার আগে এটি আমার বেশ সময় নিয়েছিল । আপনি যদি অন্য লোকের সাথে কোনও প্রকল্পে কাজ করেন, বা কোনও প্রকল্পে যদি কোনও কোডবেস আপনি x বছর পরে বুঝতে চান , তবে এই জাতীয় নির্মাণগুলি এড়ানো উচিত।
হ্যালো গুডবাই

3
যদিও আমি দেখতে পাচ্ছি যে এটি শাখা-প্রশাখা কম হওয়ায় এটি আরও অনুকূলিত হতে পারে। গতি যদি আপনার উদ্বেগ হয় তবে এটি একটি বিকল্প হতে পারে, কেবল একটি মন্তব্যে কৌশলটির পিছনে যান্ত্রিকগুলি ভালভাবে ব্যাখ্যা করার বিষয়টি নিশ্চিত করুন। একটি স্ব-ডকুমেন্টিং নামের একটি ইনলাইন ফাংশন বা ম্যাক্রোও সহায়ক হবে (তবে সম্ভবত এই ক্ষেত্রে যথেষ্ট নয়)।
হ্যালো গুডবাই

3
পাশাপাশি পাঠযোগ্যতার সম্পর্কে উদ্বেগগুলি মনে রাখবেন যে কেউ যদি 0 বা 1
বাদে

2
@ প্লাগওয়াশ আপনি অবশ্যই এটিতে পরিবর্তন করতে পারবেন printf("%s\n","false\0true"+6*(x?1:0));যা কেবলমাত্র ... 5% কম পঠনযোগ্য।
hoosierEE

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; }; এটি কেবল বর্ণনামূলকভাবে নামকরণ করা ফাংশনে মুড়িয়ে রাখুন এবং এটি পড়ার যোগ্যতা নিয়ে চিন্তা করবেন না।
yyny
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.