এএনএসআই সি 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; }; এটি কেবল বর্ণনামূলকভাবে নামকরণ করা ফাংশনে মুড়িয়ে রাখুন এবং এটি পড়ার যোগ্যতা নিয়ে চিন্তা করবেন না।