2010-11-02 23 views
6

मुझे सी ++ में एक प्रोजेक्ट मिला है जिसे मुझे संपादित करने की आवश्यकता है। यह चर की घोषणा है:जांचें कि स्ट्रिंग खाली है

LPSTR hwndTitleValue = (LPSTR)GlobalAlloc(GPTR,(sizeof(CHAR) * hwndTitleSize)); 

यह स्ट्रिंग खाली है या नहीं, यह कैसे जांचें?

मैंने बस if(hwndTitleValue == "") के साथ कोशिश की लेकिन यह हमेशा झूठी वापसी करता है। यह स्ट्रिंग खाली है या नहीं, यह कैसे जांचें?

संपादित

मैं भी अगर फाइल जुड़ा हुआ है की जाँच की जरूरत है।

// Attachment 
    OFSTRUCT ofstruct; 
    HFILE hFile = OpenFile(mmsHandle->hTemporalFileName , &ofstruct , OF_READ); 
    DWORD hFileSize = GetFileSize((HANDLE) hFile , NULL); 
    LPSTR hFileBuffer = (LPSTR)GlobalAlloc(GPTR, sizeof(CHAR) * hFileSize); 
    DWORD hFileSizeReaded = 0; 
    ReadFile((HANDLE) hFile , hFileBuffer, hFileSize, &hFileSizeReaded, NULL); 
    CloseHandle((HANDLE) hFile); 

अगर hFile खाली है कैसे जाँच करने के लिए: यहाँ फ़ाइल का कोड है?

+1

कौन सी स्ट्रिंग? बीटीडब्ल्यू एलपीआरस्ट्र, जीपीटीआर और सीएआर मानक सी ++ प्रकार नहीं हैं। –

+0

मुझे यह जांचने की ज़रूरत है कि hwndTitleValue खाली है या नहीं। –

+0

ग्लोबलएलोक एक हैंडल लौटाता है, आप इसे – Kra

उत्तर

11

मुझे विश्वास है कि hwndTitleValue कम से कम हंगेरियन नोटेशन में एक सूचक है। आपका विधि बाइट्स की एक सरणी (एक एएनएसआई सी स्ट्रिंग) है, तो सबसे अच्छा तरीका है करने के लिए यह होगा आवंटन है

#include <string.h> 
// ... other includes ... 

int isEmpty(LPSTR string) 
{ 
    if (string != NULL) 
    { 
     // Use not on the result below because it returns 0 when the strings are equal, 
     // and we want TRUE (1). 
     return !strcmp(string, ""); 
    } 

    return FALSE; 
} 

हालांकि, आप उपरोक्त विधि हैक कर सकते हैं और strcmp का उपयोग नहीं:

#include <string.h> 
// ... other includes ... 

int isEmpty(LPSTR string) 
{ 
    // Using the tip from Maciej Hehl 
    return (string != NULL && string[0] == 0); 
} 

ध्यान देने योग्य एक बात यह है कि स्ट्रिंग खाली नहीं हो सकती है लेकिन अंतरिक्ष से भरा हो सकता है। यह विधि आपको बताएगी कि स्ट्रिंग में डेटा है (रिक्त स्थान डेटा हैं!)। यदि आपको रिक्त स्थान से भरे तारों के लिए खाते की आवश्यकता है, तो आपको इसे पहले ट्रिम करना होगा।


संपादित: एक और बात ध्यान रखें कि तरीकों से ऊपर सही ढंग से शून्य संकेत से खाता नहीं है। यदि सूचक शून्य है, isEmpty FALSE लौटाएगा, जो वांछित नहीं है। हम नल चेक को हटा सकते हैं और फिर यह कॉलर की ज़िम्मेदारी बन जाता है, या हम परिभाषित कर सकते हैं कि लक्षण नल स्ट्रिंग्स पर गलत लौटाता है।

#include <string.h> 
// ... other includes ... 

int isEmpty(LPSTR string) 
{ 
    // Always return FALSE to NULL pointers. 
    if (string == NULL) return FALSE; 

    // Use not on the result below because it returns 0 when the strings are equal, 
    // and we want TRUE (1). 
    return !strcmp(string, ""); 

} 
+0

यदि स्ट्रिंग न्यूल है, तो यह फ़ंक्शन कुछ भी वापस नहीं करता है। –

+0

लेकिन मुझे आपके कोड और hwndTitleValue के बीच कनेक्शन दिखाई नहीं देता है जिसका उपयोग मैं करता हूं। धन्यवाद! –

+0

एक और संशोधन, जहां आपने 'if' कथन से छुटकारा पा लिया था और बस 'स्ट्रिंग! = NULL && string [0] = 0' लौटाया और उत्तर सही होगा :) –

2

GlobalAlloc() एक स्मृति एक स्ट्रिंग (GPTR झंडा करने के लिए धन्यवाद) के साथ शून्य भरा ब्लॉक, नहीं वापस आ जाएगी। जांच में कोई बात नहीं है। आप बेहतर जांच करेंगे कि लौटाई गई पॉइंटर शून्य नहीं है।

अगर वह पर्याप्त नहीं है कि आप एक बस

if (*hwndTitleValve == 0) { 
} 

एक वैध रिक्त स्ट्रिंग की जाँच के लिए बहुत शुरुआत में एक अशक्त टर्मिनेटर स्टोर करेगा।

+0

सच है, लेकिन सवाल का जवाब नहीं देता है। –

+0

@ ग्रेमे पेरो: चेक 'if (* str == 0)' उत्तर क्यों नहीं होगा? – sharptooth

+1

क्योंकि जब मैंने अपनी टिप्पणी जोड़ दी तो जवाब का वह हिस्सा वहां नहीं था। –

3

सबसे पहले, यह एक स्ट्रिंग नहीं है। अभी नहीं। यह सिर्फ स्मृति के एक हिस्से के लिए एक सूचक है कि सभी उद्देश्यों और उद्देश्यों के लिए कचरा होता है, यानी कुछ यादृच्छिक डेटा।

सी में स्ट्रिंग्स शून्य-समाप्त वर्ण सरणी के पॉइंटर्स हैं। तो आपकी खाली स्ट्रिंग "" वास्तव में मान शून्य के साथ एक तत्व की सरणी है। लेकिन आपकी तुलना पॉइंटर्स के बीच है, इसलिए यह हमेशा विफल हो जाती है।

if (strlen(hwndTitleValve) == 0) 

एक एएनएसआई स्ट्रिंग संभालने:

+0

क्या नल टर्मिनेटर से शुरू होने वाले किसी भी वर्ण सरणी को लंबाई के बावजूद खाली माना जाना चाहिए? – mikerobi

+0

ब्लॉक 'जीपीटीआर' ध्वज के लिए शून्य से भरा धन्यवाद होगा। – sharptooth

+0

धन्यवाद, यह थोड़ी देर हो गया है क्योंकि मैंने विंडोज पर काम किया था। –

2

GlobalAlloc समारोह सिर्फ आवंटित और स्मृति का एक ब्लॉक और GPTR विकल्प देता है आबंटित स्मृति ताकि आप केवल उपयोग कर सकते हैं के बाइट्स शून्य। ध्यान दें कि इसे सी ++ के बजाय "सी" और "विंडोज" के रूप में बेहतर ढंग से टैग किया जाएगा।

+0

यह भयानक है। यह पूरी स्ट्रिंग को स्कैन करेगा जो संभावित रूप से वेयररी लोंग हो सकता है। – sharptooth

0

मुझे यह अजीब लगता है कि एक स्ट्रिंग नाम hwnd (जो विंडोज हैंडल के लिए है) के साथ शुरू होता है, लेकिन फिर भी आप यह मान सकते हैं कि एलपीस्ट्रैर char * जैसा ही है और इसकी लम्बाई जांचने के लिए स्ट्रेलन जैसे कुछ उपयोग करें।

18

अगर एक स्ट्रिंग खाली है की जाँच करने के लिए सबसे आसान तरीका है, तो पहला वर्ण एक अशक्त बाइट है देखने के लिए है:

if(hwndTitleValue != NULL && hwndTitleValue[0] == '\0') { 
    // empty 
} 

आप strlen या strcmp अन्य उत्तर में के रूप में उपयोग कर सकते हैं, लेकिन यह एक समारोह कॉल की बचत होती है ।

+1

यह सही जवाब है। 'Strlen()' के बारे में भूल जाओ। 'strlen()' पूरी स्ट्रिंग को स्कैन करेगा जो बहुत लंबा हो सकता है। यदि स्ट्रिंग एक गजियन वर्ण लंबा है तो यह उन सभी को स्कैन करेगा। खाली स्ट्रिंग का पता लगाने के लिए केवल पहले अक्षर की जांच करें। – sharptooth

+0

यह अच्छा काम करता है। मैंने अपना प्रश्न संपादित किया और अब मुझे यह जांचने की भी आवश्यकता है कि फ़ाइल मौजूद है या नहीं। क्या आप फाइल की जांच कर सकते हैं? आपका बहुत बहुत धन्यवाद! –

+0

फ़ाइल अस्तित्व की जांच करना एक अलग समस्या है। उस प्रश्न को अलग से पूछने के लिए सबसे अच्छा - या बेहतर अभी तक, StackOverflow खोजें। उस सवाल से पहले पूछा जा सकता है। –

-1

आप चाहे स्मृति आवंटन में विफल रहा है की जाँच करना चाहते हैं तो यह इस तरह से कार्य करें:

HGLOBAL hwndTitleValue = GlobalAlloc (GPTR, (sizeof (CHAR) * hwndTitleSize));

अगर (hwndTitleValue == NULL) वापस ALLOC_FAILED;

मुझे तारों के साथ काम करने का कोई मतलब नहीं दिखता है।

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