检查字符串是否为空

时间:2010-11-02 13:10:06

标签: c++ string

我有一个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是否为空?

7 个答案:

答案 0 :(得分:18)

检查字符串是否为空的最简单方法是查看第一个字符是否为空字节:

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

您可以像在其他答案中一样使用strlenstrcmp,但这可以保存函数调用。

答案 1 :(得分: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);
}

需要注意的一点是,字符串可能不是空的,而是填充空格。此方法将告诉您字符串包含数据(空格是数据!)。如果您需要考虑填充空格的字符串,则需要先修剪它。


编辑:需要注意的另一件事是上面的方法没有正确地从NULL指针中解释。如果指针为空,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, "");

}

答案 2 :(得分:3)

首先,这不是一个字符串。还没。它只是一个指向大块内存的指针,所有意图和目的都包含垃圾,即一些随机数据。

C中的字符串是指向零终止字符数组的指针。所以你的空字符串""实际上是一个元素的数组,其值为零。但是你的比较是在指针之间,所以总是失败。

答案 3 :(得分:2)

GlobalAlloc()将返回一个填充零的内存块(感谢GPTR标志),而不是字符串。检查没有意义。您最好检查返回的指针是否为空。

如果这还不够,只需检查

if (*hwndTitleValve == 0 ) {
}

有效的空字符串将在最开始存储空终止符。

答案 4 :(得分:2)

GlobalAlloc函数只分配并返回一个内存块,GPTR选项将已分配内存的字节清零,以便您可以使用:

if (strlen(hwndTitleValve) == 0)

假设ANSI字符串。请注意,这将更好地标记为“C”和“Windows”而不是C ++。

答案 5 :(得分:0)

我觉得奇怪的是,字符串名称以hwnd开头(用于Windows句柄),但无论如何你可以假设LPSTR与char *相同,只需使用strlen之类的东西来检查它的长度。

答案 6 :(得分:-1)

如果你想检查内存分配是否以这种方式执行:

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

if(hwndTitleValue == NULL)   返回ALLOC_FAILED;

我认为在这里使用字符串没有意义。