سؤال

ربما يكون هذا سؤالًا غبيًا، ولكن هل هناك أي طريقة لتحويل قيمة منطقية إلى سلسلة بحيث يتحول 1 إلى "صحيح" و0 إلى "خطأ"؟يمكنني فقط استخدام عبارة if، ولكن سيكون من الجيد معرفة ما إذا كانت هناك طريقة للقيام بذلك باستخدام اللغة أو المكتبات القياسية.بالإضافة إلى ذلك، أنا متحذلق.:)

هل كانت مفيدة؟

المحلول

ماذا عن استخدام لغة C++ نفسها؟

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 والذي يعرض لك مخرجات وحدة التحكم ويشرح المزيد حول واجهة برمجة التطبيقات.

بالإضافة إلى ذلك باستخدام std::boolalpha سيتم تعديل الحالة العالمية ل std::cout, ، قد ترغب في استعادة السلوك الأصلي اذهب هنا لمزيد من المعلومات حول استعادة حالة std::cout.

نصائح أخرى

نحن نتحدث عن C++ أليس كذلك؟لماذا بحق السماء ما زلنا نستخدم وحدات الماكرو!؟

تمنحك وظائف C++ المضمنة نفس سرعة الماكرو، مع ميزة إضافية تتمثل في سلامة النوع وتقييم المعلمات (مما يتجنب المشكلة التي ذكرها Rodney وdwj.

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

هتافات :)


@دكتوربيتزا:هل تريد تضمين تعزيز كامل من أجل وظيفة بهذه البساطة؟لا بد انك تمزح؟

يحتوي C++ على سلاسل مناسبة لذا يمكنك استخدامها أيضًا.إنهم في سلسلة الرأس القياسية.#include <string> لاستخدامها.لا مزيد من تجاوزات المخزن المؤقت strcat/strcpy؛لا مزيد من الإنهاءات الفارغة المفقودة؛لا مزيد من الفوضى في إدارة الذاكرة اليدوية؛سلاسل معدودة مناسبة مع دلالات القيمة المناسبة.

تتمتع لغة C++ بالقدرة على تحويل القيم المنطقية إلى تمثيلات يمكن قراءتها بواسطة الإنسان أيضًا.لقد رأينا تلميحات حول ذلك سابقًا من خلال أمثلة iostream، لكنها محدودة بعض الشيء لأنها لا يمكنها سوى نقل النص إلى وحدة التحكم (أو باستخدام ملف fstreams).لحسن الحظ، لم يكن مصممو لغة C++ أغبياء تمامًا؛لدينا أيضًا تدفقات iostream لا يتم دعمها بواسطة وحدة تحكم أو ملف، ولكن بواسطة مخزن مؤقت لسلسلة تتم إدارته تلقائيًا.يطلق عليهم تيارات السلسلة.#include <sstream> للحصول عليها.ومن ثم يمكننا أن نقول:

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

وبطبيعة الحال، نحن لا نريد حقا أن نكتب كل ذلك.ولحسن الحظ، تحتوي لغة C++ أيضًا على مكتبة مناسبة تابعة لجهة خارجية تسمى يعزز التي يمكن أن تساعدنا هنا.لدى Boost وظيفة لطيفة تسمى lexical_cast.يمكننا استخدامه بالتالي:

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

الآن، من الصحيح أن نقول إن هذا يمثل حملًا أعلى من بعض الماكرو؛تتعامل سلسلة السلاسل مع اللغات المحلية التي قد لا تهتم بها، وتقوم بإنشاء سلسلة ديناميكية (مع تخصيص الذاكرة) بينما يمكن للماكرو إنتاج سلسلة حرفية، مما يتجنب ذلك.ولكن على الجانب الآخر، يمكن استخدام طريقة stringstream لعدد كبير من التحويلات بين التمثيلات القابلة للطباعة والتمثيلات الداخلية.يمكنك تشغيلها للخلف؛Boost::lexical_cast<bool>("true") يفعل الشيء الصحيح، على سبيل المثال.يمكنك استخدامها مع الأرقام وفي الواقع أي نوع باستخدام عوامل الإدخال/الإخراج المنسقة بشكل صحيح.لذلك فهي متعددة الاستخدامات ومفيدة للغاية.

وإذا كشف تحليلك وقياسك بعد كل هذا أن القوالب المعجمية تمثل عنق الزجاجة غير المقبول، هذا عندما يجب أن تفكر في القيام ببعض الرعب الكلي.

يجب أن يكون هذا جيدًا:


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

ولكن، إذا كنت تريد أن تفعل ذلك أكثر C++-ish:


#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";
}

إذا قررت استخدام وحدات الماكرو (أو تستخدم لغة C في مشروع مستقبلي)، فيجب عليك إضافة قوسين حول "b" في توسيع الماكرو (ليس لدي نقاط كافية حتى الآن لتحرير محتوى الأشخاص الآخرين):

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

هذا ال البرمجة الدفاعية تقنية تحمي من أخطاء ترتيب العمليات المخفية؛أي كيف يتم تقييم هذا؟ الجميع المترجمين؟

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

مقارنة ب

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

أستخدم برنامجًا ثلاثيًا في printf مثل هذا:

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

إذا كنت ماكرو ذلك:

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

فأنت بحاجة للتأكد من كل ما تقوم بتمريره 'b' ليس له أي آثار جانبية.ولا تنس الأقواس المحيطة بـ 'b' كما يمكن أن تحصل على أخطاء الترجمة.

مع C++ 11، يمكنك استخدام lambda للحصول على كود أكثر إحكاما قليلا واستخدامه في مكانه:

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

هذه المشاركة قديمة ولكن الآن يمكنك استخدامها std::to_string لتحويل الكثير من المتغيرات كما std::string.

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

يستخدم boolalpha لطباعة منطقي إلى السلسلة.

std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;

مرجع C ++

أوافق على أن الماكرو قد يكون هو الأفضل.لقد قمت للتو بإعداد حالة اختبار (صدقني أنني لست جيدًا في استخدام C/C++ ولكن هذا بدا ممتعًا):

#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;
}

وطالما أنه من الممكن عرض السلاسل مباشرة على أنها مصفوفة أحرف، فسيكون من الصعب جدًا إقناعي بذلك std::string يمثل السلاسل كمواطنين من الدرجة الأولى في C++.

بالإضافة إلى ذلك، يبدو أن الجمع بين التخصيص والحدود فكرة سيئة بالنسبة لي على أي حال.

جرب هذا الماكرو.في أي مكان تريد ظهور "صحيح" أو خطأ، ما عليك سوى استبداله بـ PRINTBOOL(var) حيث var هو المنطقي الذي تريد النص له.

#define PRINTBOOL(x) x?"true":"false"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top