এএনএসআই সি 99 যেহেতু রয়েছে _Bool
বা এর bool
মাধ্যমে রয়েছে stdbool.h
। তবে printf
বুলের জন্য কি এখানে কোনও ফর্ম্যাট স্পেসিফায়ার রয়েছে?
আমি সেই সিউডো কোডটির মতো কিছু বোঝাতে চাইছি:
bool x = true;
printf("%B\n", x);
যা মুদ্রণ করবে:
true
এএনএসআই সি 99 যেহেতু রয়েছে _Bool
বা এর bool
মাধ্যমে রয়েছে stdbool.h
। তবে printf
বুলের জন্য কি এখানে কোনও ফর্ম্যাট স্পেসিফায়ার রয়েছে?
আমি সেই সিউডো কোডটির মতো কিছু বোঝাতে চাইছি:
bool x = true;
printf("%B\n", x);
যা মুদ্রণ করবে:
true
উত্তর:
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);
পরিবর্তে?
printf("%s", x ? "true" : "false");
সমস্যা সমাধান করবে।
printf("%s", x ? "true" : "false");
হয় ভাল যে printf(x ? "true" : "false");
- আপনি হয় মোট ফরম্যাট স্ট্রিং এখান থেকে নিয়ন্ত্রণ, যাতে আছে কোন বিপদ এটি কিছু পাবেন "%d"
যা সমস্যার সৃষ্টি হবে। fputs
অন্যদিকে, হয় একটি ভালো বিকল্প।
fputs
"আরও ভাল" কেন ? আমি সবসময় আমার সি এর উন্নতি করার উপায় খুঁজছি যা কি পরিস্থিতিতে আমার fputs
পরিবর্তে ব্যবহার করা উচিত printf
?
বুলের জন্য কোনও বিন্যাস নির্দিষ্টকরণকারক নেই। ইন্টিগ্রাল টাইপ প্রিন্ট করার জন্য বিদ্যমান কয়েকটি স্পেসিফায়ার ব্যবহার করে আপনি এটি মুদ্রণ করতে পারেন বা আরও অভিনব কিছু করতে পারেন:
printf("%s", x?"true":"false");
bool
- C99 ভাষা বৈশিষ্ট তা অংশ সি টাইপ, শুধু নেই C89 সংস্করণ। এখানে একটি নতুন কীওয়ার্ড _Bool
রয়েছে এবং আপনি যদি অন্তর্ভুক্ত করেন <stdbool.h>
তবে এর bool
প্রতিশব্দ _Bool
।
এএনএসআই সি 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 টি অক্ষর লিখিত)
এর রীতিতে itoa()
:
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
btoa
নন-স্ট্যান্ডার্ড জাভাস্ক্রিপ্টে (গেকো এবং ওয়েবকিট) "বাইনারি স্ট্রিং থেকে বেস 64 স্ট্রিং" হয়, সুতরাং আপনি অন্য কোনও নাম ব্যবহার করতে চাইতে পারেন।
"true\0false"[(!x)*5]
:-)
!!x*5
।
আপনি যদি সি ++ সি এর চেয়ে ভাল পছন্দ করেন তবে আপনি এটি ব্যবহার করে দেখতে পারেন:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
আমি বুলের ফলকে 'মিথ্যা' বা 'সত্য' হিসাবে সিটিতে ছাপানোর সেরা উপায় থেকে উত্তর পছন্দ করি ? , যেমন
printf("%s\n", "false\0true"+6*x);
"false\0true"+6*x
সত্যিই কী করেছে তা অনুধাবন করার আগে এটি আমার বেশ সময় নিয়েছিল । আপনি যদি অন্য লোকের সাথে কোনও প্রকল্পে কাজ করেন, বা কোনও প্রকল্পে যদি কোনও কোডবেস আপনি x বছর পরে বুঝতে চান , তবে এই জাতীয় নির্মাণগুলি এড়ানো উচিত।
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; }
; এটি কেবল বর্ণনামূলকভাবে নামকরণ করা ফাংশনে মুড়িয়ে রাখুন এবং এটি পড়ার যোগ্যতা নিয়ে চিন্তা করবেন না।