检查字符串是否为空

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
哪个字符串?顺便说一下,LPRSTR、GPTR和CHAR不是标准的C++类型。 - BЈовић
我需要检查 hwndTitleValue 是否为空。 - ilija veselica
GlobalAlloc返回一个HANDLE,你不能像那样将其转换为字符串。 - Kra
@ile,作为一名合适的程序员,选择解决你问题的答案并将其标记为正确答案是基本礼仪。如果你有新的问题需要解决,请开一个新的问题进行提问。 - C. Ross
2
@ile:你的第二个问题与此无关,请提出一个新问题。 - ereOn
7个回答

18

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

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

你可以像其他答案中使用strlenstrcmp一样,但这样会节省一个函数调用。


1
这是正确的答案。忘掉 strlen() 吧。strlen() 将扫描整个非常长的字符串。如果该字符串有数十亿个字符,它将全部扫描。只需检查第一个字符即可检测出空字符串。 - sharptooth
这个很好用。我编辑了我的问题,现在我还需要检查文件是否存在。你能帮忙检查一下文件吗?非常感谢! - ilija veselica
检查文件是否存在是一个完全不同的问题。最好单独提出这个问题 - 或者更好的办法是在StackOverflow上搜索。那个问题很可能已经被问过了。 - Graeme Perrow

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指针。如果指针为NULLisEmpty将返回FALSE,这是不希望看到的。我们可以移除对NULL的检查,然后由调用者承担责任,或者我们可以定义当传入NULL字符串时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, "");

}

如果字符串为空,该函数不会返回任何内容。 - Graeme Perrow
但我没有看到你的代码和我使用的hwndTitleValue之间的连接。谢谢! - ilija veselica
再修改一下,把 if 语句去掉,直接返回 string != NULL && string[0] = 0,这样答案就完美了 :) - Maciej Hehl
1
@ile:调用isEmpty(hwndTitleValue)函数,对于空字符串返回1,对于非空字符串返回0。 - Bruno Brant
谢谢Bruno...是否可以编辑此函数或创建类似的函数,以便检查文件是否存在(请查看我编辑后的问题)? - ilija veselica
显示剩余4条评论

3

首先,这不是一个字符串。还不是。它只是一个指向一块内存的指针,实际上包含垃圾数据,即一些随机数据。

C中的字符串是指向以零结尾的字符数组的指针。因此,您的空字符串""实际上是一个值为零的一个元素的数组。但是,您的比较是在指针之间进行的,因此它总是失败的。


任何以空终止符开始的字符数组都应该被视为空,无论其长度如何,对吗? - mikerobi

2

GlobalAlloc函数仅分配并返回一块内存,并且GPTR选项会将分配的内存字节清零,因此您只需使用:

if (strlen(hwndTitleValve) == 0)

假设是一个ANSI字符串。注意,这应该被更好地标记为“C”和“Windows”,而不是C++。


这太糟糕了。这将扫描可能非常长的整个字符串。 - sharptooth

2

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

如果这对您不够,请检查

if (*hwndTitleValve == 0 ) {
}

一个有效的空字符串将在开头处存储一个空终止符。

真实,但并未回答问题。 - Graeme Perrow
@Graeme Perrow:为什么检查if(*str == 0)不是答案? - sharptooth
1
因为当我添加评论时,那部分答案还没有出现。 - Graeme Perrow
@Graeme Perrow:好的,现在已经有了。 - sharptooth

0

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


-1
如果您想检查内存分配是否失败,请使用以下方式:
HGLOBAL hwndTitleValue = GlobalAlloc(GPTR, (sizeof(CHAR) * hwndTitleSize));
if (hwndTitleValue == NULL) return ALLOC_FAILED;
我在这里看不出处理字符串的意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接