假设char *str;,要测试空字符串,以下方法有效
/* Approrach 1 */
if (str && strlen(str) > 0) {
...
}
/* Approach 2 */
if (str && *str) {
...
}
Run Code Online (Sandbox Code Playgroud)
最适合使用什么?我认为第二个会更快,因为它不必迭代缓冲区来获取长度。使用第二个还有什么缺点吗?
我将给出我认为更好的第三个选项:
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)
但这开始使特殊字符与字母字符的比率变得难以阅读。