C ++ में string को char array में कैसे कन्वर्ट करें?


103

मैं कन्वर्ट करने के लिए चाहते हैं stringके लिए charसरणी लेकिन नहीं char*। मुझे पता है कि स्ट्रिंग को कैसे परिवर्तित किया जाए char*(इसका उपयोग करके mallocया जिस तरह से मैंने इसे अपने कोड में पोस्ट किया है) - लेकिन यह वह नहीं है जो मैं चाहता हूं। मैं बस में परिवर्तित करना चाहते stringकरने के लिए char[size]सरणी। क्या यह संभव है?

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main()
{
    // char to string
    char tab[4];
    tab[0] = 'c';
    tab[1] = 'a';
    tab[2] = 't';
    tab[3] = '\0';
    string tmp(tab);
    cout << tmp << "\n";

    // string to char* - but thats not what I want

    char *c = const_cast<char*>(tmp.c_str());
    cout << c << "\n";

    //string to char
    char tab2[1024];
    // ?

    return 0;
}

12
यह सी ++ प्रतीत होता है, सी। नहीं
फ्रेड लार्सन

@FredLarson: ठीक है, संपादित, धन्यवाद
ब्रायन ब्राउन

3
संभव डुप्लिकेट का डुप्लीकेट :: स्ट्रिंग टू चार *
सीगप्रकाश

जवाबों:


123

सबसे सरल तरीका मैं यह करने के बारे में सोच सकता हूं:

string temp = "cat";
char tab2[1024];
strcpy(tab2, temp.c_str());

सुरक्षा के लिए, आप पसंद कर सकते हैं:

string temp = "cat";
char tab2[1024];
strncpy(tab2, temp.c_str(), sizeof(tab2));
tab2[sizeof(tab2) - 1] = 0;

या इस तरह से हो सकता है:

string temp = "cat";
char * tab2 = new char [temp.length()+1];
strcpy (tab2, temp.c_str());

9
इसके साथ पकड़ strncpyयह है कि यदि यह स्रोत स्ट्रिंग में एक नल खोजने से पहले आकार तक पहुंच जाता है तो यह शून्य-समाप्त नहीं होगा। उस के साथ भी सावधान रहना होगा!
फ्रेड लार्सन

1
हां, मुझे लगता है कि इसे संभालने का एक उचित तरीका है।
फ्रेड लार्सन

1
strncpy उस सुरक्षा के लिए है जिसमें strncpy आपके द्वारा दिए गए बफ़र को ओवररन नहीं करेगा। इसके अलावा strcpy_s C99 में नहीं है, लेकिन इसे हाल ही में C11 में जोड़ा गया है।
bames53

6
मुझे उस शब्द से प्यार है जिस तरह से लोग सुरक्षा शब्द का दुरुपयोग करते हैं ... ओह, स्ट्रिंग के लिए पर्याप्त जगह नहीं है, तो चलो इसे छोटा करें .. ओह, हमने गलती से रोगी के जीवन की दवा ड्रग एलर्जी के बारे में जानकारी हटा दी है .. लेकिन हमारे पास नहीं है अब एक बफर उग आया। ठीक है, मुझे लगता है कि यह सुरक्षित है ...
कारोली होर्वाथ

4
@KarolyHorvath - विभिन्न डोमेन में सुरक्षा। जाहिर है, आपको अपनी कार्यात्मक आवश्यकताओं और नॉट स्टूपिड थिंग्स की जांच करने की आवश्यकता है। लेकिन अगर आप बफर से आगे निकल जाते हैं, तो आप यह जानने की कोई गारंटी खो देते हैं कि क्या होगा। सही कोडिंग सुनिश्चित करता है कि प्रोग्राम आपके ओएस पर चलने के लिए "सुरक्षित" है। सही सोच यह सुनिश्चित करती है कि उपयोगकर्ता क्या कर रहा है, यह कार्यक्रम "सुरक्षित" है।
चौलेट

58

ठीक है, मैं हैरान हूं कि किसी ने वास्तव में एक अच्छा जवाब नहीं दिया, अब मेरी बारी है। दो मामले हैं;

  1. एक निरंतर चारित्र आपके लिए काफी अच्छा है ताकि आप उसके साथ जाएं,

    const char *array = tmp.c_str();
  2. या आपको चर सरणी को संशोधित करने की आवश्यकता है ताकि निरंतर ठीक न हो, फिर बस इसके साथ जाएं

    char *array = &tmp[0];

वे दोनों सिर्फ असाइनमेंट ऑपरेशंस हैं और ज्यादातर समय बस वही होता है, जिसकी आपको जरूरत होती है, अगर आपको वास्तव में नई कॉपी की जरूरत है तो अन्य फॉलो किए गए उत्तरों का पालन करें।


7
वह एक चार सरणी चाहता है, न कि चार *
ह्रोगैस्टन

10
उसने जो पॉइंटर बनाया था, वह चार सरणी के समान है। C और C ++ में एक सरणी चर, सरणी में पहले तत्व के लिए एक संकेतक है।
जस्टिनुक

@ JustinC.B। ज़रुरी नहीं! सरणी चर बिंदुओं में क्षय हो सकते हैं लेकिन वे C ++ में समान नहीं हैं। जैसे std::size(elem)C ++ में अच्छी तरह से परिभाषित किया गया है जब elemएक है char array, लेकिन यह जब संकलन करने में विफल रहता है elemएक है char*या const char*, आप पर इसे देख सकते हैं यहाँ
aniliitb10

16

यह करने के लिए सबसे आसान तरीका यह होगा

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());

14
सरणी आकार C ++ में एक संकलन-समय स्थिर होना चाहिए।
इंटरजय

12
str.copy(cstr, str.length()+1); // since C++11
cstr[str.copy(cstr, str.length())] = '\0';  // before C++11
cstr[str.copy(cstr, sizeof(cstr)-1)] = '\0';  // before C++11 (safe)

C C में C से बचने के लिए यह एक बेहतर अभ्यास है, इसलिए std :: string :: copy को strcpy के बजाय पसंद होना चाहिए ।



5

इस तरह से प्रयास करें यह काम होना चाहिए।

string line="hello world";
char * data = new char[line.size() + 1];
copy(line.begin(), line.end(), data);
data[line.size()] = '\0'; 



2

यदि आपको पहले से स्ट्रिंग का आकार नहीं पता है, तो आप गतिशील रूप से एक सरणी आवंटित कर सकते हैं:

auto tab2 = std::make_unique<char[]>(temp.size() + 1);
std::strcpy(tab2.get(), temp.c_str());

0

खैर मैं इस शायद बल्कि गूंगा पता से और आसान है, लेकिन मुझे लगता है कि यह काम करना चाहिए:

string n;
cin>> n;
char b[200];
for (int i = 0; i < sizeof(n); i++)
{
    b[i] = n[i];
    cout<< b[i]<< " ";
}

असल में ऐसा नहीं है। आप केवल यह मान रहे हैं कि इससे nबड़ा नहीं हो सकता b। अगर यह दुर्घटनाग्रस्त हो जाएगा n>bstrcpyपहले से दिए गए फ़ंक्शन का उपयोग करने के लिए बेहतर है । संपादित करें: कुछ मामलों में इसका उपयोग करना और भी बेहतर हो सकता है strcpy_sक्योंकि यह NULL पॉइंटर्स (यदि आपका प्लेटफ़ॉर्म इसका समर्थन करता है) के लिए चेक जोड़ता है
droidballoon

0

आप सी ++ 11 या इसके बाद के संस्करण का उपयोग कर रहे हैं, मैं का उपयोग कर सुझाव देंगे std::snprintfसे अधिक std::strcpyया std::strncpyअपनी सुरक्षा की वजह से (यानी, आप यह निर्धारित कितने वर्ण अपने बफर करने के लिए लिखा जा सकता है) और क्योंकि यह आप के लिए स्ट्रिंग (अकृत-समाप्त हो जाता है आपको इसके बारे में चिंता करने की ज़रूरत नहीं है)। यह इस तरह होगा:

#include <string>
#include <cstdio>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, sizeof(tab2), "%s", tmp.c_str());

C ++ 17 में, आपके पास यह विकल्प है:

#include <string>
#include <cstdio>
#include <iterator>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, std::size(tab2), "%s", tmp.c_str());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.