-2

这是测试返回字符串是否为空的唯一方法。每个都在对方的架构中失败。问题是为什么?为什么!=NULL在 x86_tcslen(*sDateOut)>0上失败而在 x64 上失败?:

BOOL FormatDate(TCHAR *sIn, TCHAR **sOut) {
free(*sOut);*sOut=NULL; // Clear

...
if (condition1)
    *sOut = calloc(length,sizeof(TCHAR);
...

#ifdef WIN64
    return (*sOut != NULL);
#else
    return (_tcslen(*sOut)>0);
#endif
}
4

4 回答 4

2

如果要检查空字符串,则应将第一个字符与 进行比较'\0'而不是 NULL

这样做的原因是因为NULL它应该代表一个空指针——它的实际值可能实际上并不为零。


现在回到这个例子,如果你想测试是否TCHAR **sOut是一个指向空字符串的有效指针,这个测试应该可以工作:

if (sOut && *sOut && (*sOut)[0] != _T('\0')) {
    // non-empty
} else {
    // empty or invalid pointer
}
于 2012-04-24T10:22:53.080 回答
1

实际上,两者都做了完全不同的事情:

(*sOut != NULL)

只要sOut指向有效的指向char. 这并不意味着它指向的字符串长度为零,而是没有任何字符串。

(_tcslen(*sOut)>0)

另一方面,实际上检查字符串*sOut指向的长度,并假设有一个。

因此,您应该结合检查以确保*sOut是一个非零长度的以空字符结尾的字符串:

(*sOut != NULL) && (_tcslen(*sOut)>0)

请注意,您的函数的签名看起来应该某些内容放入sOut中,因此在那里测试零长度字符串对我来说没有意义。我想你知道你在做什么。

于 2012-04-24T10:31:26.973 回答
1

sOut 是 type TCHAR **,所以 *sOut 是一个指针,而不是一个字符。

这两个测试正在检查不同的东西:

*sOut != NULL; // is the pointer NULL?

_tcslen(*sOut)>0; // does the pointer point to a zero-length string? (presumes pointer is non-NULL!)

为什么您要在 WIN64 和其他中检查两种不同的东西,从这个示例中并不清楚。

于 2012-04-24T10:31:37.990 回答
0

什么是你的“空字符串”?Null-Pointer 和零大小的字符串是另一回事。指向零大小字符串的指针不为 NULL。正确的代码必须检查两种情况:

((*sOut !=NULL) && (_tcslen(*sOut)>0))

于 2012-04-24T10:30:42.577 回答