2011-01-14 15 views
32

तो सरणी था अशक्त-समाप्त इस सुंदर सीधे आगे होगा:प्रतिलिपि बनाई जा रही गैर अशक्त-समाप्त अहस्ताक्षरित चार सरणी एसटीडी :: स्ट्रिंग

unsigned char u_array[4] = { 'a', 's', 'd', '\0' }; 
std::string str = reinterpret_cast<char*>(u_array); 
std::cout << "-> " << str << std::endl; 

हालांकि, मुझे आश्चर्य है कि क्या करने के लिए सबसे उपयुक्त तरीका है एक std::string में

unsigned char u_array[4] = { 'a', 's', 'd', 'f' }; 

: एक गैर अशक्त-समाप्त अहस्ताक्षरित चार सरणी कॉपी, निम्नलिखित की तरह।

बिना हस्ताक्षर किए गए चार सरणी पर पुन: प्रयास किए बिना ऐसा करने का कोई तरीका है?

सभी को धन्यवाद।

उत्तर

36

std::string एक constructor कि iterators की एक जोड़ी लेता है और unsigned charchar में बदला जा सकता (एक कार्यान्वयन परिभाषित ढंग से) तो यह काम करता है। reinterpret_cast की कोई आवश्यकता नहीं है।

unsigned char u_array[4] = { 'a', 's', 'd', 'f' }; 

#include <string> 
#include <iostream> 
#include <ostream> 

int main() 
{ 
    std::string str(u_array, u_array + sizeof u_array/sizeof u_array[0]); 
    std::cout << str << std::endl; 
    return 0; 
} 
बेशक

एक "सरणी आकार" टेम्पलेट समारोह sizeof गणना से अधिक मजबूत है।

+0

'हस्ताक्षर किए गए चार *' को 'char *' में कनवर्ट करना, आपको 'reinterpret_cast 'करना होगा। –

+1

@VladLazarenko: लेकिन मैं वह रूपांतरण नहीं करना चाहता हूं। –

+0

@ चार्ल्स: तब आपका कोड संकलित नहीं होगा जब तक कि आप कंपाइलर की सेटिंग्स में हस्ताक्षरित नहीं होने के लिए चार प्रकार के डिफ़ॉल्ट प्रकार को बदलते हैं;) –

3

std :: स्ट्रिंग में असाइन नाम की एक विधि है। आप एक char * और आकार का उपयोग कर सकते हैं।

http://www.cplusplus.com/reference/string/string/assign/

+2

इसमें एक निर्माता भी है जो चार सूचक और आकार लेता है। उन मामलों में जब आपके पास अभी तक एक स्ट्रिंग उदाहरण नहीं है, तो यह कन्स्ट्रक्टर का उपयोग करने के लिए समझ में आता है। –

+0

इस स्थिति के साथ समस्या यह है कि आप नहीं जानते कि आपकी स्ट्रिंग कितनी बाइट्स लेती है, और क्या कर रही है या नहीं .c_str() आपको एक वैध सी स्ट्रिंग देगा या नहीं। –

12

ठीक है, जाहिरा तौर पर std :: स्ट्रिंग एक निर्माता कि इस मामले में इस्तेमाल किया जा सकता है:

std::string str(reinterpret_cast<char*>(u_array), 4); 
+1

अधिक विचारधारात्मक विचार, लेकिन यह अच्छा होगा कि सरणी की स्थिरता को दूर न किया जाए। इसके अलावा, हार्ड-कोडिंग त्रुटि-प्रवण '4' के बजाय इसका आकार लेना। –

0

आप पहले अक्षर के लिए एक चरित्र सूचक की ओर इशारा करते बना सकते हैं, और दूसरा एक अतीत के लिए इंगित करता है, और उन दो पॉइंटर्स का उपयोग इटरेटर के रूप में करता है। इस प्रकार:

std::string str(&u_array[0], &u_array[0] + 4); 
+1

यह त्रुटि प्रवण है क्योंकि सरणी का आकार बदल सकता है, और आप आसानी से अपने '4' को नए मान के साथ बदलना भूल सकते हैं। इसके अलावा, '& u_array [0]' करने में कोई बात नहीं है, यह केवल 'u_array' के बराबर है, जो बहुत कम टाइपिंग है। –

0

प्रयास करें:

string (const char * s, size_t n); 
तो अपने उदाहरण में

:

std::string str; 
str.resize(4); 
std::copy(u_array, u_array+4, str.begin()); 
2

आप इस std::string निर्माता का उपयोग कर सकते

std::string str(u_array, 4); 
+0

आप 'sizeof (u_array) 'करके इसे बेहतर बना सकते हैं। या इससे भी बेहतर - 'sizeof (u_array)/sizeof (u_array [0])', जो डेटा प्रकारों के लिए काम करेगा, जिसका आकार 1 बाइट से बड़ा है। –

1

यह करना चाहिए:

std::string s(u_array, u_array+sizeof(u_array)/sizeof(u_array[0])); 
+0

u_array बिना हस्ताक्षरित चार प्रकार का है, और 'std :: string' का कन्स्ट्रक्टर' const char * 'लेता है, इसलिए यह संकलित भी नहीं होगा। –

+0

@Vlad Lazarenko: नहीं, जैसा कि मैंने चेक किया है, यह ठीक होना चाहिए। – cpx

+0

@ डेव, चार के लिए डिफ़ॉल्ट प्रकार हस्ताक्षरित है, हस्ताक्षरित नहीं है, और यह पूरी तरह से एक दूसरे में परिवर्तित नहीं कर सकता है। आपका कंपाइलर या तो 'char' को' unsigned 'के रूप में मानता है या यह छोटी है। किसी भी मामले में, सामान्य समाधान इन विनिर्देशों पर भरोसा नहीं करना चाहिए और स्पष्ट रूपांतरण का उपयोग नहीं करना चाहिए। आप इसे Comau ऑनलाइन या कुछ के साथ देख सकते हैं, यह काम नहीं करता है। –

3

जब इसका आकार निर्धारित किए बिना ही एक स्ट्रिंग के निर्माण, निर्माता एक एक चरित्र सरणी पर पुनरावृति और अशक्त-टर्मिनेटर, जो '\0' चरित्र है के लिए दिखेगा। आपको लगता है कि चरित्र की जरूरत नहीं है, तो आप उदाहरण के लिए स्पष्ट रूप से लंबाई निर्दिष्ट करने के लिए, है:

// --*-- C++ --*-- 

#include <string> 
#include <iostream> 


int 
main() 
{ 
    unsigned char u_array[4] = { 'a', 's', 'd', 'f' }; 
    std::string str (reinterpret_cast<const char *> (u_array), 
        sizeof (u_array)/sizeof (u_array[0])); 
    std::cout << "-> " << str << std::endl; 
} 
0

std :: स्ट्रिंग एक निर्माता चार और लंबाई की एक सरणी ले जा रहा है।

unsigned char u_array[4] = { 'a', 's', 'd', 'f' }; 
std::string str(reinterpret_cast<char*>(u_array), sizeo(u_array)); 
0

ईडब्ल्यू, कास्ट क्यों?

std::string str(u_array, u_array + sizeof(u_array)); 

हो गया।

0

वहाँ एक अभी भी एक समस्या है जब स्ट्रिंग ही एक अशक्त वर्ण है है और आप बाद में स्ट्रिंग मुद्रित करने के लिए प्रयास करें:

char c_array[4] = { 'a', 's', 'd', 0 }; 

std::string toto(array,4); 
cout << toto << endl; //outputs a 3 chars and a NULL char 

हालांकि ....

cout << toto.c_str() << endl; //will only print 3 chars. 

इसके बार जैसे कि आप सिर्फ कड़वाहट को कुचलना चाहते हैं और नंगे सी

संबंधित मुद्दे