2011-06-12 8 views
6

मैं GetEnvironmentStrings() का उपयोग कर Win32 में वातावरण चर को पुन: प्राप्त कर रहा हूँ। यह char* देता है।पर्यावरण चर * एक चार में हैं कि कैसे एक एसटीडी करने के लिए इसे पाने के लिए :: स्ट्रिंग

मैं एक विशिष्ट पर्यावरणीय चर के लिए इस स्ट्रिंग (चार सूचक) को खोजना चाहता हूं (हाँ मुझे पता है कि मैं GetEnvironmentVariable() का उपयोग कर सकता हूं लेकिन मैं इसे इस तरह से कर रहा हूं क्योंकि मैं भी कंसोल पर सभी पर्यावरण चर मुद्रित करना चाहता हूं - I बस चारों ओर झुकाव हूँ)।

तो मैं मैं एक एसटीडी के लिए char* बदल जाएगा सोचा :: स्ट्रिंग & उपयोग उस पर लगता है (मैं जानता हूँ कि मैं भी एक c_string खोज समारोह का उपयोग कर सकते लेकिन मैं एक std::string में एक char* नक़ल करने की कोशिश के बारे में अधिक चिंतित हूँ)। लेकिन निम्नलिखित कोड std::string में char* के सभी कॉपी नहीं करने के लिए (यह मुझे लगता है कि वहाँ char* लेकिन इसकी नहीं वास्तव में अंत में एक \0 चरित्र है बनाता है) लगता है।

char* a = GetEnvironmentStrings(); 
string b = string(a, sizeof(a)); 
printf("%s", b.c_str()); // prints =::= 

वहाँ एक std::string में एक char* कॉपी करने के लिए एक रास्ता है (मैं जानता हूँ कि मैं strcpy() का प्रयोग कर एक स्ट्रिंग में एक const char* कॉपी करने के लिए कर सकते हैं, लेकिन नहीं एक char*)।

+2

कौन सा एफ * इसे सही डुप्लिकेट के रूप में बंद करने का प्रयास करता है? यह एक बिल्कुल अलग सवाल है! – Xeo

+0

@Xeo: ठीक है, नहीं, यह नहीं है ... 'getenv'/'GetEnvironmentVariable' फ़ंक्शन का उपयोग अलग है लेकिन परिणाम वही है ... सभी ओपी को करने के लिए' getenv' कॉल को प्रतिस्थापित करना है 'GetEnvironmentVariable' कॉल करें। – rubenvb

+2

@ रूबेनव: GetEnvironmentStrings() को छोड़कर एक डोडी प्रारूप देता है, जिसे OP को * विशिष्ट * सहायता की आवश्यकता होती है। आप 'Getenv' को' GetEnvironmentStrings() 'के साथ प्रतिस्थापित नहीं कर सकते हैं। – Puppy

उत्तर

8

आप sizeof() उपयोग करने के लिए इस संदर्भ-में आप सिर्फ निर्माता में मूल्य पारित कर सकते हैं नहीं करना चाहती। char* trivially const char* बन जाता है और आप strcpy या printf का उपयोग नहीं करना चाहते हैं।

पारंपरिक सी strings- तथापि GetEnvironmentStrings() रिटर्न एक अजीब प्रारूप का एक सा के लिए है और आप शायद इसे मैन्युअल रूप से सम्मिलित करने के लिए की आवश्यकता होगी कि।

const char* a = GetEnvironmentStrings(); 
int prev = 0; 
std::vector<std::string> env_strings; 
for(int i = 0; ; i++) { 
    if (a[i] == '\0') { 
     env_strings.push_back(std::string(a + prev, a + i)); 
     prev = i; 
     if (a[i + 1] == '\0') { 
      break; 
     } 
    } 
} 
for(int i = 0; i < env_strings.size(); i++) { 
    std::cout << env_strings[i] << "\n"; 
} 
+0

धन्यवाद मैं समझता हूं, इसलिए यह सच होना चाहिए कि वातावरण चर के char * \ 0 वर्णों से भरा है। मैं आपका दृष्टिकोण लेता हूं लेकिन मुझे लगता है कि हर चार पर पुनरावृत्ति करने के बजाय मैं सी स्ट्रिंग फ़ंक्शन स्ट्रैटोक का उपयोग \ 0 वर्ण – Mack

+0

@Mack पर विभाजित करने के लिए करूंगा: मैक: आप ऐसा नहीं कर सकते। 'GetEnvironmentStrings' मेमोरी देता है जिसे आपको लिखने की अनुमति नहीं है, और' strtok' थ्रेड-सुरक्षित नहीं है, और यह वैसे भी बेकार असुरक्षित है। एक सी ++ दृष्टिकोण का प्रयोग करें। – Puppy

+0

@ मैक: भूलना नहीं, 'स्ट्रोक' एक छिपी हुई * गलत * चीज है और खुद ही है। यह एक पूर्ण उड़ा सिंगलटन राज्य मशीन है। – Xeo

0

निम्नलिखित किसी भी समस्याओं का कारण बनता है करता है?

char* a = GetEnvironmentStrings(); 
string b; 
b=a; 
printf("%s", b.c_str()); 
+0

अच्छी तरह से मुझे std :: स्ट्रिंग में और अधिक मिला, यह प्रिंट करता है: = :: = :: \ now – Mack

1

है कि आप ऊपर है char* के आकार वापस आ जाएगी में sizeof(a), यानि कि एक सूचक (32 या 64bits आमतौर पर)। आप वहां strlen फ़ंक्शन ढूंढ रहे थे। और यह वास्तव में बिल्कुल आवश्यक नहीं है:

std::string b(a); 

पहले पर्यावरण परिवर्तनीय जोड़ी प्राप्त करने के लिए पर्याप्त होना चाहिए।

+1

GetEnvironmentStrings के लिए दस्तावेज़ देखें- यह पर्याप्त नहीं होगा। – Puppy

+0

धन्यवाद लेकिन मैंने कोशिश की है और यह अभी भी प्रिंट करता है = :: = यह मुझे लगता है कि प्रत्येक पर्यावरण चर के अंत में एक \ 0 वर्ण है, इसलिए मुझे उस छोटे से – Mack

+0

@ मैक मिल रहा है, हाँ, उपरोक्त केवल पहले को पकड़ लेंगे, माफ करना, मैं उस पर्यावरण ब्लॉक लेआउट को भूल गया। – Mat

0

आप जब कहते हैं:

string b = string(a, sizeof(a)); 

आप एक का आकार है, जो एक सूचक है और शायद 4. तो तुम पहले 4 अक्षर मिल जाएगा है हो रही है। मुझे यकीन है कि तुम सच में ऐसा करने की कोशिश कर रहे हैं नहीं कर रहा हूँ, लेकिन आप कहने के लिए सिर्फ सक्षम होना चाहिए:

string b(a); 
0

मुझे लगता है तुम्हारा मतलब Windows API GetEnvironmentStrings कार्य करते हैं। तो, नलप्टर के खिलाफ परिणाम का परीक्षण करें और सरल असाइनमेंट करें:

char* env = ::GetEnvironmentStrings(); 
if (0 != env) 
{ 
    std::string senv = env; 
    // use senv to find variables 
} 
else 
{ 
    // report problem or ignore 
} 
संबंधित मुद्दे