2010-11-02 156 views
6

我得到了一個需要編輯的C++項目。這是一個變量的聲明:檢查字符串是否爲空

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

如何檢查此字符串是否爲空?我試過if(hwndTitleValue == ""),但它總是返回false。如何檢查這個字符串是否爲空?

編輯

我還需要檢查,如果該文件附後。以下是該文件的代碼:

// 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

哪個字符串? btw LPRSTR,GPTR和CHAR不是標準的C++類型。 – 2010-11-02 13:11:57

+0

我需要檢查hwndTitleValue是否爲空。 – 2010-11-02 13:13:59

+0

的GlobalAlloc返回一個句柄,你不能將它轉換爲像 – Kra 2010-11-02 13:15:37

回答

11

我相信hwndTitleValue是一個指針,至少在匈牙利符號中是這樣。你的方法分配的字節數組(一個ANSI C字符串),這樣做的最好的方式,是

#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,這不是期望的。我們可以刪除NULL檢查,然後它成爲調用者的職責,或者我們可以定義isEmpty返回FALSE到NULL字符串。

#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

如果字符串爲NULL,則此函數不返回任何內容。 – 2010-11-02 13:18:07

+0

但我沒有看到您的代碼和我使用的hwndTitleValue之間的連接。謝謝! – 2010-11-02 13:19:49

+0

還有一個版本,在那裏你擺脫了'if'聲明,只是返回字符串'= NULL &&串[0] = 0',答案將是完美的:) – 2010-11-02 13:20:00

2

GlobalAlloc()將返回以零填充(感謝GPTR標誌)的存儲塊,而不是一個字符串。檢查沒有意義。你最好檢查返回的指針是否爲空。

如果這是不夠的,你一個剛剛檢查

if (*hwndTitleValve == 0) { 
} 

有效的空字符串將存儲空終止在開始的時候。

+0

是的,但沒有回答這個問題。 – 2010-11-02 13:18:43

+0

@Graeme Perrow:爲什麼不檢查if(* str == 0)'是一個答案? – sharptooth 2010-11-02 13:20:06

+1

因爲那部分答案在我添加評論時並不存在。 – 2010-11-02 13:20:54

3

首先,這不是一個字符串。還沒。它只是一個指向大塊內存的指針,對於所有意圖和目的而言都包含垃圾,即一些隨機數據。

字符串中C是指針零結尾字符陣列。所以你的空字符串""實際上是一個值爲零的元素的數組。但是你的比較是指針,所以它總是失敗。

+0

不應該將任何以空終止符開始的字符數組視爲空,不管長度如何? – mikerobi 2010-11-02 13:27:16

+0

由於'GPTR'標誌,塊將被填滿。 – sharptooth 2010-11-02 13:27:49

+0

謝謝,我從事Windows工作已經有一段時間了。 – 2010-11-02 13:38:47

2

的功能的GlobalAlloc分配公正,並返回一個內存塊和GPTR選項歸零分配的內存,所以你可以只使用的字節:

if (strlen(hwndTitleValve) == 0) 

假設ANSI字符串。請注意,這會更好地標記爲「C」和「Windows」,而不是C++。

+0

這太可怕了。這將掃描整個字符串,可能會有很大的延伸。 – sharptooth 2010-11-02 13:23:05

0

我覺得奇怪的是,一個字符串名稱以hwnd開頭(這是Windows的句柄),但無論如何,你可以假設LPSTR與char *是一樣的,只是使用類似strlen的東西來檢查它的長度。

18

檢查一個字符串是空的最簡單的方法是看是否第一個字符是一個空字節:

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

您可以使用strlenstrcmp在其他的答案,但是這可以節約函數調用。

如果要檢查內存分配是否失敗
+1

這是正確的答案。忘記'strlen()'。 'strlen()'會掃描整個可能很長的字符串。如果字符串是一個巨大的字符長度,它會掃描它們。只檢查第一個字符來檢測空字符串。 – sharptooth 2010-11-02 13:24:32

+0

這工作很好。我編輯了我的問題,現在我還需要檢查文件是否存在。你能檢查一下這個文件嗎?非常感謝你! – 2010-11-02 13:34:21

+0

檢查文件存在是完全不同的問題。最好單獨提出這個問題 - 或者更好的是,搜索StackOverflow。之前可能會問到這個問題。 – 2010-11-02 14:40:41

-1

這樣來做:

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

如果(hwndTitleValue == NULL) 返回ALLOC_FAILED;

這裏我沒有看到使用字符串的要點。