एक char * को std :: string में बदलें


262

मुझे std::stringपुनर्प्राप्त किए गए डेटा को संग्रहीत करने के लिए उपयोग करने की आवश्यकता है fgets()। ऐसा करने के लिए मुझे एक एरे में स्टोर char*से रिटर्न वैल्यू fgets()को एक std::stringस्टोर में बदलना होगा । यह कैसे किया जा सकता है?

जवाबों:


376

std::string इसके लिए एक निर्माता है:

const char *s = "Hello, World!";
std::string str(s);

ध्यान दें कि इससे चरित्र सूची पर गहरी प्रतियां बनती हैं sऔर sहोनी चाहिए nullptr, वरना व्यवहार अपरिभाषित होता है।


6
अगर यह है तो क्या होगा?
कार्सन मायर्स

14
स्टैंडर्ड का कहना है कि कंस्ट्रक्टर पैरामीटर "एक अशक्त सूचक नहीं होगा" - यह निर्दिष्ट नहीं करता है कि किसी भी अपवाद को फेंक दिया गया है।

24
क्या यह उथली है या गहरी नकल है?

4
@pushkin नहीं str, सिर्फ एक चर नाम है। यह कुछ भी हो सकता है: S, abc, l, I, strHelloWorld। जाहिर है कुछ विकल्प दूसरों की तुलना में बेहतर हैं। लेकिन इस उदाहरण के strलिए काफी स्वीकार्य है।
मोहभंग हो गया

10
@ माधटर यह एक गहरी प्रति है। पॉइंटर एलोकेशन रहेगा, और स्ट्रिंग अपने आप एक नया एलोकेशन कर देगा।
मूडबॉम

127

यदि आप पहले से ही चार * का आकार जानते हैं, तो इसके बजाय इसका उपयोग करें

char* data = ...;
int size = ...;
std::string myString(data, size);

यह strlen का उपयोग नहीं करता है।

संपादित करें: यदि स्ट्रिंग चर पहले से मौजूद है, तो असाइन का उपयोग करें ():

std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);

1
एक तरह का सवाल, यूजीन। यदि डेटा बाद में दिनचर्या में आबाद नहीं होता है, तो आप myString को कैसे प्रारंभ करते हैं? क्या आप बस myString चर घोषित करते हैं जब यह आबादी है?
इडेडांटे

2
int size = strlen (डेटा);
व्लाद

@vlad: विचार यह है कि आप किसी अन्य स्रोत से आकार जानते हैं और / या डेटा एक C- स्ट्रिंग नहीं है (जिसमें nulls हैं या null में समाप्त नहीं होता है)। यदि आपके पास एक सी-स्ट्रिंग है तो आप बस myString = डेटा कर सकते हैं; यह आप के लिए समतुल्य या समतुल्य चलेगा।
यूजीन

1
@huseyintugrulbuyukisik आपको अभी भी मूल स्मृति को ठीक से निपटाने की आवश्यकता है - std :: string बाइट्स की नकल करेगी, यह स्वामित्व नहीं लेती है।
यूजीन

2
@ZackLee यह बाइट्स के लिए नई मेमोरी आवंटित करेगा और उन सभी को वहां कॉपी करेगा, ताकि यह जितना गहरा हो सके। यदि आप उथली प्रतिलिपि के लिए क्षमता चाहते हैं, तो आपको एक std :: string को दूसरे में कॉपी करने की आवश्यकता है। फिर कुछ कार्यान्वयन एक उथली प्रति मेरे विचार से कर सकते हैं।
यूजीन

30

अधिकांश उत्तर निर्माण के बारे में बात करते हैं 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

28

मुझे fd द्वारा प्राप्त डेटा को संग्रहीत करने के लिए std :: string का उपयोग करने की आवश्यकता है ()।

fgets()जब आप C ++ प्रोग्रामिंग कर रहे हैं तो क्यों इस्तेमाल कर रहे हैं? क्यों नहीं std::getline()?


18

कंस्ट्रक्टर के माध्यम से इसे पास करें:

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

3
c_str()रिटर्नconst char*
स्टीव जेसप

1
सही, आप डेटा को एक std :: string में c_str () के माध्यम से संशोधित नहीं कर सकते। यदि आप डेटा को बदलने का इरादा रखते हैं, तो c_str () से सी स्ट्रिंग को यादगार होना चाहिए
कार्सन मायर्स

11
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;

6
char* data;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;

5

मैं एक नई विधि का उल्लेख करना चाहूंगा जो उपयोगकर्ता द्वारा परिभाषित शाब्दिक का उपयोग करता है 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;

2

मैं बस 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!


0
char* data;
std::string myString(data);

9
इस परिणाम का अपरिभाषित व्यवहार किया जाएगा।

1
केवल इन दो पंक्तियों के साथ, dataअसिंचित (खाली) रहता है।
हेलटोनबीकर

1
प्रदान किए गए पॉइंटर की सही "लंबाई" के बिना, यह कोड खोए हुए डेटा का कारण बन सकता है, आपका std :: string मूल
चार्ट की

0

निश्चित नहीं कि एरिक के अलावा किसी ने इसका उल्लेख क्यों नहीं किया, लेकिन इस पृष्ठ के अनुसार , असाइनमेंट ऑपरेटर ठीक काम करता है। एक निर्माता, .assign (), या .append () का उपयोग करने की आवश्यकता नहीं है।

std::string mystring;
mystring = "This is a test!";   // Assign C string to std:string directly
std::cout << mystring << '\n';

1
यह कार्यात्मक रूप से काम करता प्रतीत होता है, लेकिन जब मैंने ऐसा किया, तो मुझे प्रोग्राम के अंत में वैलग्राइंड रिपोर्टिंग के पहुंच योग्य ब्लॉक के साथ मुद्दे मिलना शुरू हो गए, =(और +=) के अंदर "नया" से उत्पन्न हुआ । यह इस तरह से शाब्दिक के साथ नहीं लगता है, लेकिन सिर्फ char*चीजों के साथ । ऐसी रिपोर्ट हैं कि क्या का मुद्दा वास्तव में लीक कर रहे हैं यहाँ पर चर्चा की । लेकिन अगर मैंने destString = std::string(srcCharPtr);असाइनमेंट को बदल दिया तो वैलगाइंड लीक की रिपोर्ट चली गई। YMMV।
HostileFork का कहना है कि

HostileFork की टिप्पणी से आपको विश्वास हो सकता है कि एक चार से एक स्ट्रिंग का निर्माण * (जैसे कि फ़िज़ से) std :: string इस मेमोरी के जीवनकाल को प्रबंधित करेगा। बहरहाल, मामला यह नहीं। मानक 21.4.2.7 और .9 देखें Constructs an object of class basic_string and determines its initial string value from the array। यह कहता है कि मूल्य और बफ़र्स या पॉइंटर स्वामित्व के बारे में कुछ भी नहीं है।
एरिक वैन वेलजेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.