मुझे std::stringपुनर्प्राप्त किए गए डेटा को संग्रहीत करने के लिए उपयोग करने की आवश्यकता है fgets()। ऐसा करने के लिए मुझे एक एरे में स्टोर char*से रिटर्न वैल्यू fgets()को एक std::stringस्टोर में बदलना होगा । यह कैसे किया जा सकता है?
मुझे std::stringपुनर्प्राप्त किए गए डेटा को संग्रहीत करने के लिए उपयोग करने की आवश्यकता है fgets()। ऐसा करने के लिए मुझे एक एरे में स्टोर char*से रिटर्न वैल्यू fgets()को एक std::stringस्टोर में बदलना होगा । यह कैसे किया जा सकता है?
जवाबों:
std::string इसके लिए एक निर्माता है:
const char *s = "Hello, World!";
std::string str(s);
ध्यान दें कि इससे चरित्र सूची पर गहरी प्रतियां बनती हैं sऔर sहोनी चाहिए nullptr, वरना व्यवहार अपरिभाषित होता है।
str, सिर्फ एक चर नाम है। यह कुछ भी हो सकता है: S, abc, l, I, strHelloWorld। जाहिर है कुछ विकल्प दूसरों की तुलना में बेहतर हैं। लेकिन इस उदाहरण के strलिए काफी स्वीकार्य है।
यदि आप पहले से ही चार * का आकार जानते हैं, तो इसके बजाय इसका उपयोग करें
char* data = ...;
int size = ...;
std::string myString(data, size);
यह strlen का उपयोग नहीं करता है।
संपादित करें: यदि स्ट्रिंग चर पहले से मौजूद है, तो असाइन का उपयोग करें ():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
अधिकांश उत्तर निर्माण के बारे में बात करते हैं std::string।
यदि पहले से निर्मित है, तो बस असाइनमेंट ऑपरेटर का उपयोग करें ।
std::string oString;
char* pStr;
... // Here allocate and get character string (e.g. using fgets as you mentioned)
oString = pStr; // This is it! It copies contents from pStr to oString
कंस्ट्रक्टर के माध्यम से इसे पास करें:
const char* dat = "my string!";
std::string my_string( dat );
दूसरे तरीके से जाने के लिए आप function string.c_str () का उपयोग कर सकते हैं:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()रिटर्नconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
मैं एक नई विधि का उल्लेख करना चाहूंगा जो उपयोगकर्ता द्वारा परिभाषित शाब्दिक का उपयोग करता है s। यह नया नहीं है, लेकिन यह अधिक सामान्य होगा क्योंकि इसे C ++ 14 स्टैंडर्ड लाइब्रेरी में जोड़ा गया था।
सामान्य मामले में बहुत ही कम:
string mystring = "your string here"s;
लेकिन यह आपको व्यापक स्ट्रिंग्स के साथ ऑटो का उपयोग करने की अनुमति देता है:
auto mystring = U"your UTF-32 string here"s;
और यहाँ है जहाँ यह वास्तव में चमकता है:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
मैं बस std::string(char*)शीर्ष-रेटेड उत्तर की तरह कंस्ट्रक्टर का उपयोग करने के लिए MSVC2005 के साथ संघर्ष कर रहा हूं । जैसा कि मैं इस संस्करण को हमेशा भरोसेमंद http://en.cppreference.com/w/cpp/string/basic_string/basic_string पर # 4 के रूप में सूचीबद्ध देखता हूं , मैं एक पुराना संकलक भी प्रदान करता हूं।
मुझे यह महसूस करने में इतना समय लग गया है कि यह रचनाकार (unsigned char*)तर्क के साथ मेल खाने से इनकार करता है! मुझे std::stringतर्क के प्रकार से मेल करने में विफलता के बारे में ये अयोग्य त्रुटि संदेश मिले , जो निश्चित रूप से वह नहीं था जिसके लिए मैं लक्ष्य कर रहा था। बस std::string((char*)ucharPtr)मेरी समस्या का हल के साथ तर्क कास्टिंग ... duh!
char* data;
std::string myString(data);
dataअसिंचित (खाली) रहता है।
निश्चित नहीं कि एरिक के अलावा किसी ने इसका उल्लेख क्यों नहीं किया, लेकिन इस पृष्ठ के अनुसार , असाइनमेंट ऑपरेटर ठीक काम करता है। एक निर्माता, .assign (), या .append () का उपयोग करने की आवश्यकता नहीं है।
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=(और +=) के अंदर "नया" से उत्पन्न हुआ । यह इस तरह से शाब्दिक के साथ नहीं लगता है, लेकिन सिर्फ char*चीजों के साथ । ऐसी रिपोर्ट हैं कि क्या का मुद्दा वास्तव में लीक कर रहे हैं यहाँ पर चर्चा की । लेकिन अगर मैंने destString = std::string(srcCharPtr);असाइनमेंट को बदल दिया तो वैलगाइंड लीक की रिपोर्ट चली गई। YMMV।
Constructs an object of class basic_string and determines its initial string value from the array। यह कहता है कि मूल्य और बफ़र्स या पॉइंटर स्वामित्व के बारे में कुछ भी नहीं है।