বুলকে সি ++ এ টেক্সটে রূপান্তর করা হচ্ছে


94

হতে পারে এটি বোবা প্রশ্ন, তবে বুলেয়ান মানকে এমন স্ট্রিতে রূপান্তর করার কোনও উপায় আছে যে 1 টি "সত্য" এবং 0 টি "মিথ্যা" তে পরিণত হয়? আমি কেবলমাত্র যদি একটি বিবৃতি ব্যবহার করতে পারি তবে ভাষা বা স্ট্যান্ডার্ড লাইব্রেরির সাথে এটি করার কোনও উপায় আছে কিনা তা জানতে পেরে ভাল লাগবে। প্লাস, আমি একজন প্যাডেন্ট :)


6
আপত্তি! স্থানীয়করণের কী হবে? কেন কোনও ভাষাতেই ভাষা-নির্দিষ্ট আক্ষরিক ধ্রুবক থাকে?
ভালডো

4
@ ভ্যাল্ডো - আমি নিশ্চিত যে আমি যে প্রকল্পে কাজ করছি তার জন্য আন্তর্জাতিকীকরণ কোনও উদ্বেগের বিষয় নয়। সেই সময় এটি সম্ভবত একটি স্কুল প্রকল্প ছিল।
জেসন বেকার

উত্তর:


119

সি ++ ভাষা নিজেই কীভাবে ব্যবহার করবেন?

bool t = true;
bool f = false;
std::cout << std::noboolalpha << t << " == " << std::boolalpha << t << std::endl;        
std::cout << std::noboolalpha << f << " == " << std::boolalpha << f << std::endl;

হালনাগাদ:

যদি আপনি কোন কনসোল আউটপুট ছাড়া কোডের 4 লাইন চেয়ে বেশি চান তাহলে, দয়া করে এখানে যান cppreference.com এর পাতা সম্পর্কে কথা বলা std::boolalphaএবংstd::noboolalpha যা আপনি শো কনসোল আউটপুট এবং API সম্পর্কে আরো ব্যাখ্যা করে।

অতিরিক্তভাবে ব্যবহার করা std::boolalphaবিশ্বব্যাপী অবস্থার সংশোধন করবে std::cout, আপনি মূল আচরণটি পুনরুদ্ধার করতে এখানে যেতে আরও তথ্যের জন্য যেতে পারেনstd::cout


আমি সি ++ তে সম্পূর্ণ নবাগত। কেউ আমাকে ব্যাখ্যা করতে পারেন যে এটি কীভাবে কাজ করে?
চকি

4
@ চাকি আপনি অপারেটর ওভারলোডিং বুঝতে না পারলে এটি কীভাবে কাজ করে তা আপনি বুঝতে সক্ষম হবেন না । কীভাবে কাজ করে তা ব্যাখ্যা করা এই প্রশ্নের ক্ষেত্রের বাইরে। আপনাকে এটি অন্যরকম প্রশ্ন হিসাবে পোস্ট করতে হবে বা এই প্রশ্নের বিদ্যমান উত্তরগুলি সন্ধান করতে হবে। আমি উত্তরোত্তর সুপারিশ
মাইকেল ডারস্ট

4
এটি কেবল বুলিয়ানদের পাঠ্য হিসাবে মুদ্রণ করে, এটি তাদের পাঠ্য / স্ট্রিংয়ে রূপান্তর করে না।
atoMerz

তাহলে কীভাবে এটি ওপি কর্তৃক প্রদত্ত "বুলিয়ান মানকে স্ট্রিংয়ে রূপান্তর করতে" ব্যর্থ হয়?
গ্রাহাম.রিডস

4
এই কোডটি কোনও বুলিয়ানকে স্ট্রিতে রূপান্তর করে না। একটি পরিবর্তনশীল তৈরি করুন std::string strএবং যদি আপনি পারেন তবে এটিতে রূপান্তরটির ফলাফল সংরক্ষণ করুন।
রোজিনা

77

আমরা সি ++ এর কথা বলছি? কেন পৃথিবীতে আমরা এখনও ম্যাক্রো ব্যবহার করছি !?

টাইপ-সুরক্ষা এবং পরামিতি মূল্যায়নের অতিরিক্ত সুবিধা সহ সি ++ ইনলাইন ফাংশন আপনাকে ম্যাক্রোর মতো একই গতি দেয় (যা রডনি এবং ডিডিজি উল্লিখিত সমস্যাটিকে এড়িয়ে চলে।

inline const char * const BoolToString(bool b)
{
  return b ? "true" : "false";
}

এক্ষেত্রে আমার আরও কয়েকটি গ্রিপ রয়েছে, বিশেষত স্বীকৃত উত্তরটির সাথে :)

// this is used in C, not C++. if you want to use printf, instead include <cstdio>
//#include <stdio.h>
// instead you should use the iostream libs
#include <iostream>

// not only is this a C include, it's totally unnecessary!
//#include <stdarg.h>

// Macros - not type-safe, has side-effects. Use inline functions instead
//#define BOOL_STR(b) (b?"true":"false")
inline const char * const BoolToString(bool b)
{
  return b ? "true" : "false";
}

int main (int argc, char const *argv[]) {
    bool alpha = true;

    // printf? that's C, not C++
    //printf( BOOL_STR(alpha) );
    // use the iostream functionality
    std::cout << BoolToString(alpha);
    return 0;
}

চিয়ার্স :)


@ ড্রিপজ্জা: এই সাধারণ কোনও ফাংশনের খাতিরে পুরো বাস্ট লাইব অন্তর্ভুক্ত করবেন? আপনি নিশ্চয়ই মজা করা পেয়েছেন?


@ নাথানফেলম্যান, গৃহীত উত্তরটি খুব ধীর। string"সত্য" এবং "মিথ্যা" জন্য স্ট্রিং ধ্রুবক স্ট্যাটিক কনস্ট ভেরিয়েবলগুলিতে সংরক্ষণ করা হয় তবে এটির জন্য উন্নতি করা যেতে পারে ।
সার্জ রোগাচ

এটি একটি সমস্যাযুক্ত উত্তর, যেহেতু: ১. কখনও কখনও আপনি "হ্যাঁ" বা "না" "সত্য বা" মিথ্যা "এবং কখনও কখনও" সাফল্য "বনাম" ব্যর্থতা "ইত্যাদি চান। 2. কখনও কখনও আপনি নিম্ন কেস চান, কখনও কখনও উচ্চতর কেস, একসময় শিরোনাম কেস।
einpoklum

4
প্রশ্নটি পড়ুন, এটি ঠিক অনুরোধ করা হয়েছিল।
ওজে

@ আইনপোকলুম আপনার পছন্দসই রূপান্তরগুলির জন্য যতটা ইনলাইন ফাংশন তৈরি করতে চান তা কিছুই আপনাকে থামিয়ে দিচ্ছে না।
রোজিনা

4
ক্রাঞ্চে আপনি যা করতে পারেন:cout << (bool_x ? "true": "false") << endl;
ট্রেভর বয়ড স্মিথ

22

সি ++ এর যথাযথ স্ট্রিং রয়েছে যাতে আপনি এগুলিও ব্যবহার করতে পারেন। তারা স্ট্যান্ডার্ড শিরোনাম স্ট্রিং এ। এগুলিকে ব্যবহার করতে # স্ট্রিং> অন্তর্ভুক্ত করুন। আর আর স্ট্রিকাট / স্ট্রিপিপি বাফার ওভাররান হবে না; আর নাল টার্মিনেটর অনুপস্থিত; আর কোনও অগোছালো ম্যানুয়াল মেমরি পরিচালনা নয়; যথাযথ মান শব্দার্থক সহ সঠিক গণনাযুক্ত স্ট্রিং।

সি ++ এর মধ্যেও বুলগুলি মানব-পঠনযোগ্য উপস্থাপনায় রূপান্তর করতে পারে। আমরা এর আগে ইওস্ট্রিমের উদাহরণগুলির সাথে ইঙ্গিতগুলি দেখেছি তবে সেগুলি কিছুটা সীমাবদ্ধ কারণ তারা কেবলমাত্র কনসোলটিতে পাঠ্যটি বিস্ফোরিত করতে পারে (বা fstreams সহ একটি ফাইল)। ভাগ্যক্রমে, সি ++ এর ডিজাইনাররা সম্পূর্ণ বোকা ছিল না; আমাদের কাছে আইওস্ট্রিম রয়েছে যা কনসোল বা কোনও ফাইল নয়, স্বয়ংক্রিয়ভাবে পরিচালিত স্ট্রিং বাফার দ্বারা ব্যাক করা আছে। এগুলিকে স্ট্রিংস্ট্রিম বলা হয়। এগুলি পেতে # অন্তর্ভুক্ত <স্ট্রিম>। তারপরে আমরা বলতে পারি:

std::string bool_as_text(bool b)
{
    std::stringstream converter;
    converter << std::boolalpha << b;   // flag boolalpha calls converter.setf(std::ios_base::boolalpha)
    return converter.str();
}

অবশ্যই, আমরা আসলে এটি সমস্ত টাইপ করতে চাই না। ভাগ্যক্রমে, সি ++ এর বুস্ট নামে একটি সুবিধাজনক তৃতীয় পক্ষের লাইব্রেরি রয়েছে যা আমাদের এখানে সহায়তা করতে পারে। বুস্টের একটি দুর্দান্ত ফাংশন রয়েছে যার নাম লেক্সিক্যাল_কাস্ট। আমরা এটি এভাবে ব্যবহার করতে পারি:

boost::lexical_cast<std::string>(my_bool)

এখন, এটি সত্য যে এটি কোনও ম্যাক্রোর চেয়ে বেশি ওভারহেড; স্ট্রিং স্ট্রিমগুলি সেই লোকেলগুলির সাথে ডিল করে যা আপনি নাও পাত্তা দিতে পারেন এবং একটি গতিশীল স্ট্রিং তৈরি করেন (মেমরি বরাদ্দ দিয়ে) যেখানে ম্যাক্রো একটি আক্ষরিক স্ট্রিং দিতে পারে যা এড়ানো যায় avo তবে ফ্লিপ দিকে, স্ট্রিং স্ট্রিম পদ্ধতিটি মুদ্রণযোগ্য এবং অভ্যন্তরীণ উপস্থাপনার মধ্যে দুর্দান্ত রূপান্তরগুলির জন্য ব্যবহার করা যেতে পারে। আপনি 'পিছনে তাদের চালাতে পারেন; বুস্ট :: লেজিক্যাল_কাস্ট <বিউল> ("সত্য") উদাহরণস্বরূপ সঠিক কাজটি করে। আপনি এগুলি সংখ্যার সাথে ব্যবহার করতে পারেন এবং প্রকৃতপক্ষে কোনও ধরণের সঠিক ফর্ম্যাটেড I / O অপারেটরগুলির সাথে। সুতরাং তারা বেশ বহুমুখী এবং দরকারী।

এবং যদি এই সব আপনার প্রোফাইলিং এবং স্থির করা মাপকাঠি পর জানায় যে lexical_casts একটি অগ্রহণযোগ্য বোতলের হয়, যে যখন আপনি কিছু ম্যাক্রো ভয়াবহ করছেন বিবেচনা করা উচিত।


4
বুস্ট :: লেক্সিক্যাল_কাস্ট <বুুল> ("সত্য") মনে হচ্ছে একটি খারাপ_আলভিত্তিক_কাস্ট ব্যতিক্রম ছুঁড়েছে
ব্যবহারকারী

4
আমার অ্যাপ্লিকেশনটিতে কাজ করবেন না, "isExist:" + boost :: lexical_cast <std :: string> (isExit)); ফলাফলগুলি উপস্থিত রয়েছে: 0
স্কট 理论 理论

8

এটি ঠিক করা উচিত:


const char* bool_cast(const bool b) {
    return b ? "true" : "false";
}

তবে, আপনি যদি এটি আরও সি ​​++ করতে চান - ইশ:


#include <iostream>
#include <string>
#include <sstream>
using namespace std;

string bool_cast(const bool b) {
    ostringstream ss;
    ss << boolalpha << b;
    return ss.str();
}

int main() {
    cout << bool_cast(true) << "\n";
    cout << bool_cast(false) << "\n";
}

5

আপনি যদি ম্যাক্রোগুলি ব্যবহার করার সিদ্ধান্ত নেন (বা ভবিষ্যতের প্রকল্পে সি ব্যবহার করছেন) আপনার ম্যাক্রো প্রসারণে 'বি' এর আশেপাশে প্রথম বন্ধনী যুক্ত করা উচিত (অন্য ব্যক্তির সামগ্রী সম্পাদনা করার জন্য আমার কাছে পর্যাপ্ত পয়েন্ট নেই):

#define BOOL_STR(b) ((b)?"true":"false")

এটি একটি প্রতিরক্ষামূলক প্রোগ্রামিং প্রযুক্তি যা অপ্রচালিত ক্রিয়াকলাপের ত্রুটিগুলি থেকে রক্ষা করে; অর্থাত্, সমস্ত সংকলকগুলির জন্য এটি কীভাবে মূল্যায়ন করে ?

1 == 2 ? "true" : "false"

তুলনা করা

(1 == 2) ? "true" : "false"

ডি 2 কে রেপ করার আগেও আপনি আসলে অন্য ব্যক্তির সামগ্রী সম্পাদনা করতে পারেন। এটি পর্যালোচনা করা হবে, তবে অবশ্যই আপনি পারেন।
সিসড্রেগন

2

আমি এই জাতীয় প্রিন্টে একটি টের্নারি ব্যবহার করি:

printf("%s\n", b?"true":"false");

আপনি যদি ম্যাক্রো করেন:

B2S(b) ((b)?"true":"false")

তারপরে আপনাকে নিশ্চিত করতে হবে যে আপনি যা পাস করেন 'b'তাতে কোনও পার্শ্ব প্রতিক্রিয়া নেই। এবং কাছাকাছি বন্ধনীগুলি ভুলে যাবেন না 'b'কারণ আপনি সংকলন ত্রুটি পেতে পারেন।


যেমন 'বি' কেবলমাত্র ম্যাক্রো সংজ্ঞাতে একবার দেখায়, আপনি কেন পার্শ্ব প্রতিক্রিয়া সম্পর্কে সতর্ক করছেন?
পোস্টফিউচারিস্ট

2

সি ++ 11 এর সাহায্যে আপনি কিছুটা কমপ্যাক্ট কোড এবং জায়গা ব্যবহারের জন্য ল্যাম্বডা ব্যবহার করতে পারেন:

bool to_convert{true};
auto bool_to_string = [](bool b) -> std::string {
    return b ? "true" : "false";
};
std::string str{"string to print -> "};
std::cout<<str+bool_to_string(to_convert);

মুদ্রণ:

string to print -> true

1

এই পোস্টটি পুরানো তবে এখন আপনি std::to_stringপ্রচুর ভেরিয়েবল রূপান্তর করতে ব্যবহার করতে পারেন std::string

http://en.cppreferences.com/w/cpp/string/basic_string/to_string


4
আপনি এটি করতে পারবেন তবে আপনি যদি এটি একটি বুল ভেরিয়েবলের সাহায্যে করেন তবে এটি "সত্য" বা "মিথ্যা" পরিবর্তে কেবলমাত্র "1" বা "0" রূপান্তর করবে।
ডেভিড ই

1

এতে ostream টেনে না নিয়ে:

constexpr char const* to_c_str(bool b) {
   return  
    std::array<char const*, 2>{"false", "true "}[b]
   ;
};


0

সহজ সম্পর্কে:

constexpr char const* toString(bool b)
{
   return b ? "true" : "false";
}

0

সি ++ 20 std::format("{}"

https://en.cppreferences.com/w/cpp/utility/format/formatter#Standard_format_specifications দাবি করে যে ডিফল্ট আউটপুট ফর্ম্যাটটি ডিফল্টরূপে স্ট্রিং হবে:

auto s6 = std::format("{:6}", true);  // value of s6 is "true  "

এবং:

উপলব্ধ বুল উপস্থাপনা প্রকারগুলি হ'ল:

  • কিছুই নয়, পাঠ্য উপস্থাপনা (সত্য বা মিথ্যা, বা স্থানীয় নির্দিষ্ট ফর্ম) অনুলিপি করে।
  • বি, বি, সি, ডি, ও, এক্স, এক্স: স্ট্যাটিক_কাস্ট (মান) সহ পূর্ণসংখ্যা উপস্থাপনা প্রকারগুলি ব্যবহার করে।

সম্পর্কিত: স্ট্রাইন্ড :: স্প্রিন্টফের মতো স্ট্রিং ফর্ম্যাটিং


-5

আমি সম্মত যে ম্যাক্রো সেরা ফিট হতে পারে। আমি সবেমাত্র একটি পরীক্ষার মামলা দিয়েছি (বিশ্বাস করুন আমি সি / সি ++ তে ভাল নই তবে এই মজাদার মজাদার):

#include <stdio.h>
#include <stdarg.h>

#define BOOL_STR(b) (b?"true":"false")

int main (int argc, char const *argv[]) {
    bool alpha = true;
    printf( BOOL_STR(alpha) );
    return 0;
}

-5

যতক্ষণ না স্ট্রিংগুলি সরাসরি চর অ্যারে হিসাবে দেখা যায় এটি আমাকে বোঝা সত্যিই কঠিন হতে পারে যে std::stringস্ট্রিংগুলি সি ++ এ প্রথম শ্রেণির নাগরিক হিসাবে প্রতিনিধিত্ব করে।

তদতিরিক্ত, বরাদ্দ এবং সীমাবদ্ধতা একত্রিত করা যাইহোক আমার কাছে একটি খারাপ ধারণা বলে মনে হয়।


-7

এই ম্যাক্রো চেষ্টা করুন। আপনি যে কোনও জায়গায় "সত্য" বা মিথ্যা প্রদর্শন করতে চান কেবল এটিই PRINTBOOL (var) দিয়ে প্রতিস্থাপন করুন যেখানে ভেরটি হ'ল আপনি যে পাঠ্যটি চান তার জন্য।

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

4
সেই ম্যাক্রোতে কিছু বন্ধনী প্রয়োজন, যে কারণেই সম্ভবত আপনি ডাউনটি পেয়েছেন।
পোস্টফিউচারিস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.