我有一个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
是否为空?
答案 0 :(得分:18)
检查字符串是否为空的最简单方法是查看第一个字符是否为空字节:
if( hwndTitleValue != NULL && hwndTitleValue[0] == '\0' ) {
// empty
}
您可以像在其他答案中一样使用strlen
或strcmp
,但这可以保存函数调用。
答案 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;
我认为在这里使用字符串没有意义。