Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 测试零长度字符串的有效方法是什么:`strlen(str)>;0`或`*str`_C_Strlen - Fatal编程技术网

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

C 测试零长度字符串的有效方法是什么:`strlen(str)>;0`或`*str`,c,strlen,C,Strlen,假设char*str,以测试空字符串,以下方法有效 /* Approrach 1 */ if (str && strlen(str) > 0) { ... } /* Approach 2 */ if (str && *str) { ... } 最可取的方法是什么?我假设second会更快,因为它不必迭代缓冲区来获得长度。使用第二个也有什么缺点吗 最可取的方法是什么 显然是第一位,因为这是最可读的。方法2,因为如果字符串不是空的,第一次尝

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

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

/* Approach 2 */
if (str && *str) {
    ...
}
最可取的方法是什么?我假设second会更快,因为它不必迭代缓冲区来获得长度。使用第二个也有什么缺点吗

最可取的方法是什么


显然是第一位,因为这是最可读的。

方法2,因为如果字符串不是空的,第一次尝试将迭代字符串。不,方法2没有缺点。

我会忽略性能问题。CLANG和GCC将为“-O3”选项生成相同的代码


第一种方法更明确地表达了程序员的意图。

如果启用了优化,编译器不太可能生成不同的代码。但是,如果性能确实是一个问题,那么最好使用第二种方法。我说可能,因为它不是100%确定的。谁知道优化器会做什么?但是,如果字符串不是空的,则第一种方法可能会迭代整个字符串

说到可读性,我想说第一个更具可读性。然而,使用
*str
测试空字符串在C语言中非常惯用。任何经验丰富的C代码编写者都会立即理解它的含义。所以TBH,可读性问题主要是为了防止不是C程序员的人阅读代码。如果有人不明白
如果(str&&*str)
做了什么,那么你也不希望他们修改代码


如果您正在使用的代码库有一个编码标准,请坚持使用该标准。如果没有,就挑一个你最喜欢的。这并不重要。

我会给出第三个我认为更好的选择:

if (str && str[0]) {
    // ... 
}
strlen
方法并不理想,因为它可以迭代非零长度的字符串。编译器可能会完全优化该调用(正如已经指出的),但不会在每个编译器上都进行优化(我假设
-ffreestanding
选项会禁用该优化),而且它至少会让看起来需要做更多的工作

<>但是,我认为<代码> [0 ] < /代码>比“代码> */CODE >有更清晰的意图。我通常建议在取消引用指向单个对象的指针时使用
*
,当指针指向数组的第一个元素时使用
[0]


要特别清楚,您可以执行以下操作:

if (str && str[0] != '\0') {
    // ... 
}

但这就开始将特殊字符与字母数的比率向难读方向倾斜。

对strlen
的调用可能会在大多数现代/体面的编译器上进行内联/优化,以实现大致相同的功能。在任何情况下,只要找到第一个nul字节,它就会停止“迭代”。无论如何,当我手动迭代
str
的元素时,我倾向于使用类似于(2)的形式。但是,在这种情况下,我通常已经知道
str
不是空的,我可以通过将条件写为
*str!=”来澄清我的意图\0'
。我再一次对编译器优化感到惊讶。这是不断扩展规则的又一个例子:在给定的情况下,写任何可读性最好的东西@tstanisl我甚至没有想到编译器优化,谢谢!