C ++ में टेक्स्ट को कंवर्ट करना


93

शायद यह एक गूंगा सवाल है, लेकिन क्या बूलियन मान को स्ट्रिंग में बदलने का कोई तरीका है जैसे 1 "सच" में बदल जाता है और 0 "झूठे" में बदल जाता है? मैं सिर्फ एक अगर बयान का उपयोग कर सकता हूं, लेकिन यह जानना अच्छा होगा कि भाषा या मानक पुस्तकालयों के साथ ऐसा करने का कोई तरीका है। साथ ही, मैं एक पेडेंट हूं। :)


6
अनापत्ति! स्थानीयकरण के बारे में क्या? एक भाषा में ही भाषा-विशिष्ट शाब्दिक स्थिरांक क्यों होंगे?
वाल्डो

1
@valdo - मुझे पूरा यकीन है कि जिस परियोजना पर मैं काम कर रहा था, उसके लिए अंतर्राष्ट्रीयकरण चिंता का विषय नहीं था। उस समय, यह एक स्कूल प्रोजेक्ट था।
जेसन बेकर

जवाबों:


118

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 ++ का पूरा नौसिखिया हूं। क्या कोई मुझे समझा सकता है कि यह कैसे काम करता है?
चौकी

4
@Chucky आप समझ नहीं पाएंगे कि जब तक आप ऑपरेटर ओवरलोडिंग को नहीं समझते हैं, तब तक यह कैसे काम करता है । यह बताना कि यह काम इस सवाल के दायरे से कितना दूर होगा। आपको या तो इसे एक अलग प्रश्न के रूप में पोस्ट करना होगा, या उस प्रश्न के मौजूदा उत्तरों को देखना होगा। मैं बाद की सलाह देता हूं
माइकल डोरस्ट

2
यह केवल पाठ के रूप में बूलियन प्रिंट करता है, यह उन्हें पाठ / स्ट्रिंग में परिवर्तित नहीं करता है।
atoMerz

तो किस तरह से यह ओपी द्वारा दिए गए "मान को एक बूलियन मान को स्ट्रिंग में बदलने के लिए" मानदंड में विफल रहता है?
graham.reeds

2
यह कोड एक बूलियन को स्ट्रिंग में परिवर्तित नहीं करता है। एक वैरिएबल बनाएं std::string strऔर उसमें रूपांतरण के परिणाम को सहेजें, यदि आप कर सकते हैं।
रोजीना 13:29 13:13

76

हम C ++ के बारे में बात कर रहे हैं? पृथ्वी पर हम अभी भी मैक्रोज़ का उपयोग क्यों कर रहे हैं !?

C ++ इनलाइन फ़ंक्शंस आपको मैक्रो के समान गति प्रदान करते हैं, प्रकार-सुरक्षा और पैरामीटर मूल्यांकन के अतिरिक्त लाभ के साथ (जो उस समस्या से बचता है जिसे रॉडने और 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;
}

चियर्स :)


@DrPizza: इस सरल कार्य की खातिर एक संपूर्ण बढ़ावा देने वाले कार्य को शामिल करें? तुम मज़ाक कर रहे हो?


@ नथनफेलमैन, स्वीकृत उत्तर बहुत धीमा है। stringयदि "सही" और "असत्य" के लिए स्ट्रिंग स्थिरांक स्थिर स्थिरांक में संग्रहीत किए जाते हैं , तो इसे बेहतर बनाया जा सकता है ।
सर्ज रोजै

यह एक समस्याग्रस्त उत्तर है, क्योंकि: 1. कभी-कभी आप "सही" या "झूठे" के बजाय "हां" या "नहीं" चाहते हैं, और कभी-कभी "सफलता" बनाम "असफलता" आदि। 2. कभी-कभी आप निचला मामला चाहते हैं, कभी-कभी ऊपरी केस, कुछ समय शीर्षक का मामला।
ईनपोकलम

2
प्रश्न पढ़ें, यह वही है जो अनुरोध किया गया था।
ओ जे।

@einpoklum कुछ भी आपको अपने इच्छित रूपांतरणों के लिए उतने इनलाइन फ़ंक्शंस बनाने से नहीं रोक रहा है जितना आप चाहते हैं।
रोजीना 13:29

2
एक क्रंच में आप कर सकते हैं:cout << (bool_x ? "true": "false") << endl;
ट्रेवर बॉयड स्मिथ

22

C ++ में उचित तार हैं ताकि आप उनका उपयोग कर सकें। वे मानक हेडर स्ट्रिंग में हैं। #include <string> उनका उपयोग करने के लिए। कोई और अधिक strcat / strcpy बफ़र ओवररन; कोई और अधिक लापता शून्य टर्मिनेटर; कोई और अधिक गन्दा मैनुअल मेमोरी प्रबंधन; उचित मूल्य शब्दार्थ के साथ उचित गिने हुए तार।

C ++ में बूल को मानव-पठनीय अभ्यावेदन में भी परिवर्तित करने की क्षमता है। हमने इससे पहले आईस्ट्रीम उदाहरणों के साथ संकेत देखे थे, लेकिन वे थोड़े सीमित हैं क्योंकि वे केवल पाठ को कंसोल (या फ़ॉस्ट्रीम, एक फ़ाइल) के साथ ब्लास्ट कर सकते हैं। सौभाग्य से, C ++ के डिजाइनर पूर्ण बेवकूफ नहीं थे; हमारे पास iostreams भी हैं जो कंसोल या फ़ाइल द्वारा समर्थित नहीं हैं, लेकिन स्वचालित रूप से प्रबंधित स्ट्रिंग बफ़र द्वारा। वे कड़े कहलाते हैं। उन्हें पाने के लिए # streamसंकट को कम करें। तब हम कह सकते हैं:

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)

अब, यह कहना सही है कि यह कुछ मैक्रो की तुलना में अधिक ओवरहेड है; स्ट्रिंगस्ट्रीम उन स्थानों से निपटते हैं जिनकी आप परवाह नहीं कर सकते हैं, और एक गतिशील स्ट्रिंग (मेमोरी आवंटन के साथ) बना सकते हैं जबकि मैक्रो शाब्दिक स्ट्रिंग प्राप्त कर सकता है, जो इससे बचता है। लेकिन दूसरी तरफ, प्रिंट करने योग्य पद्धति का उपयोग प्रिंट करने योग्य और आंतरिक अभ्यावेदन के बीच कई रूपांतरणों के लिए किया जा सकता है। आप उन्हें पीछे की ओर चला सकते हैं; बढ़ावा देना :: lexical_cast <bool> ("सच") सही काम करता है, उदाहरण के लिए। आप उन्हें संख्याओं के साथ और वास्तव में किसी भी प्रकार के सही स्वरूपित I / O ऑपरेटरों के साथ उपयोग कर सकते हैं। इसलिए वे काफी बहुमुखी और उपयोगी हैं।

और अगर यह सब अपने रूपरेखा और बेंचमार्किंग के बाद पता चलता है कि lexical_casts एक अस्वीकार्य टोंटी कर रहे हैं, कि जब आप कुछ मैक्रो हॉरर कर विचार करना चाहिए।


3
बूस्ट :: lexical_cast <bool> ("सच") एक bad_lexical_cast अपवाद फेंकने के लिए लगता है
उपयोगकर्ता

3
मेरे ऐप में काम नहीं कर रहा है, "Exist: "+ बढ़ावा :: lexical_cast <std :: string> (isExit)); परिणाम हैं: 0
स्कॉट 理论 '

8

यह ठीक होना चाहिए:


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

5

यदि आप मैक्रोज़ का उपयोग करने का निर्णय लेते हैं (या भविष्य की परियोजना पर सी का उपयोग कर रहे हैं) तो आपको मैक्रो विस्तार में 'बी' के आसपास कोष्ठक जोड़ना चाहिए (मेरे पास अन्य लोगों की सामग्री को संपादित करने के लिए अभी तक पर्याप्त बिंदु नहीं हैं):

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

यह एक रक्षात्मक प्रोग्रामिंग तकनीक है जो छिपे हुए ऑर्डर-ऑफ-ऑपरेशंस त्रुटियों से बचाता है; अर्थात, यह सभी संकलक के लिए कैसे मूल्यांकन करता है ?

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

की तुलना में

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

डे 2k प्रतिनिधि होने से पहले भी आप वास्तव में अन्य लोगों की सामग्री को संपादित कर सकते थे। इसकी समीक्षा की जाएगी, लेकिन निश्चित रूप से आप कर सकते हैं।
SysDragon

2

मैं इस तरह से एक प्रिंट में एक ternary का उपयोग करता हूं:

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

यदि आप इसे मैक्रो करते हैं:

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

फिर आपको यह सुनिश्चित करने की आवश्यकता है कि आप जो भी पास करते हैं 'b'उसका कोई साइड इफेक्ट नहीं है। और के 'b'रूप में आप संकलन त्रुटियों मिल सकता है चारों ओर कोष्ठक मत भूलना ।


जैसा कि 'बी' मैक्रो परिभाषा में केवल एक बार दिखाई देता है, आप दुष्प्रभावों की चेतावनी क्यों दे रहे हैं?
पोस्टफुटुरिस्ट

2

C ++ 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.cppreference.com/w/cpp/string/basic_string/to_string


आप कर सकते हैं, लेकिन यदि आप एक बूल चर पर ऐसा करते हैं तो यह "सही" या "गलत" के बजाय केवल संख्यात्मक मान, "1" या "0" में परिवर्तित हो जाएगा।
डेविड ई

1

ओस्ट्रीम को इसमें खींचे बिना:

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

-5

मैं मानता हूं कि एक मैक्रो सबसे फिट हो सकता है। मैंने सिर्फ एक परीक्षण मामले को मार दिया (मुझे विश्वास है कि मैं 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;
}

-5

जब तक तार सीधे एक चार सरणी के रूप में देखे जा सकते हैं, यह वास्तव में मुझे समझाने के लिए कठिन होने जा रहा है std::string जो सी ++ में प्रथम श्रेणी के नागरिकों के रूप में तार का प्रतिनिधित्व करता है।

इसके अलावा, आवंटन और सीमा का संयोजन मेरे लिए वैसे भी एक बुरा विचार है।


-7

इस मैक्रो की कोशिश करो। कहीं भी आप "सही" या असत्य दिखाना चाहते हैं, बस इसे PRINTBOOL (var) से बदलें जहाँ var वह बूल है जिसके लिए आप पाठ चाहते हैं।

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

2
उस मैक्रो में कुछ कोष्ठकों की आवश्यकता है, जो संभवत: इसीलिए आपको मिला।
पोस्टफुटुरिस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.