如何检查LPCTSTR变量是否为空或空字符串

4
下面的代码无法运行。我想检查lpClassName是否为null或空。
static HRESULT WINAPI ExampleMethod(
    __in_opt  LPCTSTR lpClassName)
{
    //code to check whether lpClassName is null or empty
    if( lpClassName == 0)
        return 0;

    if(*lpClassName) == L'\0')
        return 0;           
}

3
具体来说,是什么没有起作用? - bash.d
2
如果两个测试“通过”,您希望返回什么代码?(即在结尾处缺少return语句)。 - trojanfoe
正如我指出的,你需要首先检查这是一个字符串指针还是一个ATOM。如果它是一个ATOM,那么你实际上是在解引用一个不是指针的东西。 - IInspectable
实际上,我有一个方法,其中lpclassname是其输入。我正在使用wcscmp在该方法内将lpclassname与字符串进行比较。如果lpclassname为空,则比较失败。因此,在进行比较之前,我想检查lpclassname是否为null或空。 - Mami
1
#define S_OK ((HRESULT)0L) - 这基本上是为两个失败分支返回成功代码。虽然与您的问题无关,但您真的应该在尝试奔跑之前学会走路。 - IInspectable
显示剩余5条评论
1个回答

11

我使用一个更短的形式:

if (lpClassName == NULL || lpClassName[0] == 0)

如果您只需要测试字符串是否为空,则无需获取整个字符串的长度。如果指针为空,短路规则将防止语句的后半部分导致错误。

除此之外,我认为您提供的代码也可以正常工作。

编辑:在这种情况下,指针似乎来自CreateWindowEx,这意味着它可能不是实际的字符串指针,而是一个ATOM值。区分它们的方法是检查上位比特是否都为零。Microsoft对资源ID使用相同的约定,并提供IS_INTRESOURCE来测试此条件。


1
你的代码和问题中的代码都因同样的原因失败了:lpClassName不是指针,而是一个类ATOM,这与问题所暗示的不同。如果问题中提到了这个小细节,那将会非常有帮助... - IInspectable
1
@Mami,你所缺少的是IInspectable提到的 - 这里被称为字符串指针的东西并不真正是一个字符串指针。在某些情况下可能是,但你遇到了它不是的情况。查看生成指针的文档。 - Mark Ransom
1
if (!lpClassName || !lpClassName[0]) - SigTerm
2
@SigTerm,是的,那是一种强硬的做法。我更喜欢更加明确,这样在我看来更易读。 - Mark Ransom
1
@Mami 这已经有点荒谬了。我提供了文档链接,但你选择不去阅读。我提供了代码来测试参数是否为“ATOM”,但你选择忽略它。我提供了API调用,以便你甚至不需要知道什么是“lpClassName”。但你再次未能阅读或理解。你对建议免疫。我将不再忽视这一点。这就是结束。 - IInspectable
显示剩余11条评论

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