2010-11-02 158 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;

这里我没有看到使用字符串的要点。