मुझे 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
। यह कहता है कि मूल्य और बफ़र्स या पॉइंटर स्वामित्व के बारे में कुछ भी नहीं है।