测试零长度字符串的有效方法是什么:“strlen(str) > 0”或“*str”

shu*_*ham 2 c strlen

假设char *str;,要测试空字符串,以下方法有效

/* Approrach 1 */
if (str && strlen(str) > 0) {
    ... 
}

/* Approach 2 */
if (str && *str) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

最适合使用什么?我认为第二个会更快,因为它不必迭代缓冲区来获取长度。使用第二个还有什么缺点吗?

Tho*_*ger 5

我将给出我认为更好的第三个选项:

if (str && str[0]) {
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

strlen方法并不理想,因为它可以迭代非零长度的字符串。编译器可能会完全优化该调用(正如已经指出的那样),但它不会在每个编译器上(并且我假设该-ffreestanding选项会禁用此优化),并且它至少使它看起来需要进行更多工作。

然而,我认为[0]比 具有更清晰的意图*。我通常建议*在取消引用指向单个对象的指针时使用,并[0]在该指针指向数组的第一个元素时使用。


为了更加清楚,你可以这样做:

if (str && str[0] != '\0') {
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

但这开始使特殊字符与字母字符的比率变得难以阅读。