एक चर सरणी को स्ट्रिंग में कैसे बदलें?


254

C ++ stringको चार सरणी में बदलना c_strस्ट्रिंग के फंक्शन का उपयोग करके बहुत सीधा है और फिर कर रहा है strcpy। हालांकि, इसके विपरीत कैसे करें?

मैं एक चार सरणी की तरह है: char arr[ ] = "This is a test";वापस करने के लिए परिवर्तित string str = "This is a test:।

जवाबों:


369

stringकक्षा एक निर्माता है कि एक शून्य-समाप्त सी-स्ट्रिंग लेता है:

char arr[ ] = "This is a test";

string str(arr);


//  You can also assign directly to a string.
str = "This is another string";

// or
str = arr;

2
यह अभी भी किसी भी तरह से काम करेगा। अतिभारित असाइनमेंट ऑपरेटर एक लेता है const char*, इसलिए आप इसे एक स्ट्रिंग शाब्दिक या चार सरणी (जो उस पर लागू होता है) पास कर सकते हैं।
मिस्टिकल

3
@ kingsmasher1: सच पूछिये तो, के रूप में तार "hello world" कर रहे हैं सरणियों। यदि आप इसका उपयोग करते हैं, तो sizeof("hello world")यह आपको सूचक के आकार (संभावित 4 या 8) के बजाय सरणी का आकार (जो कि 12) देगा।
ड्रीमलैक्स

7
ध्यान दें कि यह केवल निरंतर पूर्ण -समाप्त सी-स्ट्रिंग्स के लिए काम करता है । stringनिर्माता, साथ काम नहीं करेंगे उदाहरण के लिए, एक से पारित कर दिया तर्क स्ट्रिंग के रूप में घोषित unsigned char * buffer, कुछ बाइट धारा पुस्तकालयों से निपटने में बहुत आम।
सीएक्सजे

4
कुछ भी स्थिर होने की कोई आवश्यकता नहीं है। यदि आपके पास किसी भी प्रकार की बाइट बफर है, तो आप अन्य कंस्ट्रक्टर का उपयोग कर सकते हैं: std::string str(buffer, buffer+size);लेकिन std::vector<unsigned char>उस मामले में छड़ी करना बेहतर है ।
आर। मार्टिनो फर्नांडिस

2
हालांकि यह स्पष्ट हो सकता है: strहै नहीं परिवर्तन किया-समारोह यहां। यह स्ट्रिंग चर का नाम है। आप किसी अन्य चर नाम (जैसे string foo(arr);) का उपयोग कर सकते हैं । रूपांतरण std :: string के कंस्ट्रक्टर द्वारा किया जाता है जिसे अंतर्निहित रूप से कहा जाता है।
क्रिस्टोफर के।

55

एक और समाधान इस तरह लग सकता है,

char arr[] = "mom";
std::cout << "hi " << std::string(arr);

जो अतिरिक्त चर का उपयोग करने से बचता है।


क्या आप इस उत्तर में संकेत कर सकते हैं कि यह मेरे उत्तरदाता के स्वीकृत उत्तर से कैसे भिन्न है?
Maarten Bodewes

@owlstead कृपया संपादन देखें। मैंने बस अपना उत्तर दिया क्योंकि इसकी इच्छा जो मैंने देखी थी जब मैंने पहली बार इस पृष्ठ पर उत्तर की तलाश में आया था। अगर कोई इस पृष्ठ पर मेरे जैसा ही गूंगा है, लेकिन पहले उत्तर को देखने से वह संबंध बनाने में सक्षम नहीं है, तो मुझे उम्मीद है कि मेरा उत्तर उनकी मदद करेगा।
स्टैकपशर

5
जैसा कि string () std :: string का कंस्ट्रक्टर है, यह उल्लेख के लायक हो सकता है कि आपको नामस्थान std जोड़ने की आवश्यकता है यदि आप std नाम स्थान का उपयोग नहीं कर रहे हैं। उदाहरण:cout << "test:" + std::string(arr);
क्रिस्टोफर के।

1
@ChristopherK। मैंने उसे छोड़ दिया क्योंकि ऐसा करने से टॉप रेटेड उत्तर मिला। मेरा उत्तर उस उत्तर के पूरक के रूप में है, इसलिए मैंने वही धारणाएँ रखीं। उम्मीद है कि कोई भी जो समझ में नहीं आता है कि आपकी टिप्पणी देखेंगे
stackPusher

क्या एक चर नाम है या एक कुंजी है जिसका मैं उपयोग कर सकता हूं string aString(someChar);?
ड्रिस बाउंसर

31

शीर्ष मतों के जवाब में एक छोटी सी समस्या याद आती है। अर्थात्, चरित्र सरणी में 0. शामिल हो सकता है। यदि हम एकल पैरामीटर के साथ निर्माता का उपयोग करेंगे जैसा कि ऊपर बताया गया है कि हम कुछ डेटा खो देंगे। संभव समाधान है:

cout << string("123\0 123") << endl;
cout << string("123\0 123", 8) << endl;

आउटपुट है:

123
123 123


2
यह एक बेहतर उत्तर है यदि आप std::stringबाइनरी डेटा के लिए एक कंटेनर के रूप में उपयोग कर रहे हैं और यह निश्चित नहीं हो सकता है कि सरणी में '\ 0' शामिल नहीं है।
अस्सिल Ksiksi

11
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main ()
{
  char *tmp = (char *)malloc(128);
  int n=sprintf(tmp, "Hello from Chile.");

  string tmp_str = tmp;


  cout << *tmp << " : is a char array beginning with " <<n <<" chars long\n" << endl;
  cout << tmp_str << " : is a string with " <<n <<" chars long\n" << endl;

 free(tmp); 
 return 0;
}

बाहर:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long

फ्री (tmp) कहाँ है? क्या स्ट्रिंग उसकी देखभाल करती है?
हुसैन तुगरुल बायुकिसिक

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