c++ मैं कंसल्ट char*को स्ट्रिंग में कनवर्ट कैसे कर सकता हूँ और फिर वापस चार*




string const (4)

मैं सिर्फ सी ++ शुरू कर रहा हूं और मुझे समझ में आ रहा हूं कि मैं समझता हूं। मैं विधि में इनपुट को string में कनवर्ट करने की कोशिश कर रहा हूं, और उसके बाद स्ट्रिंग को हाइफ़न जोड़ने के लिए जहां मैं चाहता हूं और अंत में उस स्ट्रिंग को लेता हूं और इसे वापस लौटने के लिए char* परिवर्तित कर रहा हूं। अब तक जब मैं कोशिश करता हूं यह मुझे बस त्रुटि 10 देता है

char* getHyphen(const char* input){
    string vowels [12] = {"A","E","I","O","U","Y","a","e","i","o","u","y"};

    //convert char* to string
    string a;
    int i = 0;
    while(input != '\0'){
        a += input[i];
        input++;
        i++;
    }

    //convert string to char*

    return NULL;
}

https://code.i-harness.com


ए: std::string क्लास के पास कंस्ट्रक्टर है जो char const* लेता है, इसलिए आप बस अपना रूपांतरण करने के लिए एक उदाहरण बनाते हैं।

बी: std::string उदाहरणों में एक c_str() सदस्य फ़ंक्शन होता है जो एक char const* जिसे आप वापस char const* कनवर्ट करने के लिए उपयोग कर सकते हैं।

auto my_cstr = "Hello";        // A
std::string s(my_cstr);        // A
// ... modify 's' ...
auto back_to_cstr = s.c_str(); // B

सबसे पहले, इनपुट से std::string बनाने के लिए आपको उस सभी कोड की आवश्यकता नहीं है। आप बस का उपयोग कर सकते हैं:

string a(input);

जहां तक ​​एक नया char* लौटते हैं, आप इसका उपयोग कर सकते हैं:

return strdup(a.c_str());  // strdup is a non-standard function but it
                           // can be easily implemented if necessary.

वापस लौटा मूल्य को निरुपित करना सुनिश्चित करें।

यह सिर्फ एक std::string वापस करना बेहतर होगा ताकि आपके फ़ंक्शन के उपयोगकर्ताओं को स्मृति आवंटन / डेलोकेशन के बारे में चिंता न करें।

std::string getHyphen(const char* input){

से अपने फ़ंक्शन घोषणा बदलें

char* getHyphen(const char* input)

सेवा मेरे

auto hyphenated( string const& input )
    -> string

और रूपांतरण के सभी समस्याओं को char const* और वापस करने के लिए बचें

उस ने कहा, आप एक char_const* से std::string निर्माण कर सकते हैं:

string( "Blah" )

और आप c_str विधि का उपयोग करके एक अस्थायी char const* वापस प्राप्त करें

ध्यान दें कि c_str का परिणाम केवल तब तक मान्य है जब तक मूल string आवृत्ति मौजूद नहीं है और संशोधित नहीं है। उदाहरण के लिए, c_str को स्थानीय string लागू करने और उस परिणाम को लौटने के लिए, उपज अपरिभाषित व्यवहार और एक अच्छा विचार नहीं है। अगर आपको बिल्कुल भी char* या char const* लौटना चाहिए, तो सरणी को new साथ आवंटित करें और return strcpy( new char[s.length()+1], s.c_str() ) साथ प्रतिलिपि बनाएं, जैसे: return strcpy( new char[s.length()+1], s.c_str() ) , जहां +1 समाप्त करने के लिए शून्य-बाइट को समाप्त करना है।


char* उपयोग न करें std::string उपयोग करें, जैसे अन्य सभी आपको बता रहे हैं। यह ऐसी सभी समस्याओं को समाप्त करेगा

हालांकि, पूर्णता की खातिर और क्योंकि आप पृष्ठभूमि को समझना चाहते हैं, आइए देखें कि क्या हो रहा है।

while(input != '\0'){

आप शायद इसका अर्थ है:

while(*input != '\0') {

आपका कोड input पॉइंटर को खुद \0 से तुलना करता है, अर्थात यह एक अशक्त-सूचक के लिए जांचता है, जो कि \0 char से दुर्भाग्यपूर्ण स्वत: रूपांतरण के कारण होता है अगर आप तुलना करने की कोशिश करते हैं, तो कहें, 'x' या 'a' , तो आपको रनटाइम क्रैश के बजाय एक संकलन त्रुटि मिलेगी।

आप को इंगित करने के लिए *input माध्यम से पॉइंट को अधिसूचना देना चाहते हैं।

a += input[i];
input++;
i++;

यह भी काम नहीं करेगा आप input पॉइंटर को बढ़ाते हैं, फिर भी [i] आप आगे भी आगे बढ़ते हैं । उदाहरण के लिए, यदि input तीन गुणा वृद्धि हो चुका है, तो input[3] समारोह में पारित मूल सरणी का 7 वां वर्ण होगा, चारवां नहीं यह अंततः अपरिभाषित व्यवहार में परिणाम होता है जब आप सरणी की सीमा को छोड़ देते हैं। अपरिभाषित व्यवहार "बस त्रुटि 10" भी हो सकता है

से बदलो:

a += *input;
input++;
i++;

(असल में, अब i अब किसी भी समय का उपयोग नहीं किया है, आप इसे पूरी तरह से हटा सकते हैं।)

और मुझे इसे दोबारा दोहराएं: char* उपयोग न करें std::string उपयोग करें





const