在 C 语言中判断字符串非空:str str[0] vs strlen
在 C 语言开发中,我们经常需要判断一个字符串是否为空(即是否存在有效字符)。
一、判断字符串是否为空的常见做法
最常见的做法有两种:
1.使用 strlen 判断长度:
if (str != NULL && strlen(str) > 0) {// 字符串非空
}
2、使用首字符检查
if (str && str[0]) {// 字符串非空
}
二、str && str[0] 和 strlen之间的差异
这两种写法都能判断字符串非空,但细节和性能有差异。
1、访问越界问题分析
有人可能会担心,写成 str && str[0] 会不会访问越界?
分析如下:
//假设str是一个字符串,为了代码安全性,需要判断是否为空才能进行下一步操作
if (str && str[0]) {//判断安全后进行下一步操作
}以上代码分两步执行:
(1)判断str指针是否为NULL
如果指针为 NULL,右边的 [0] 根本不会执行(C 语言中 && 有短路 特性)
(2)执行str[0],访问字符串的第一个字符
如果字符串为空(""),第一个字符是 '\0'
访问的内存永远合法
所以这种写法完全安全,不会越界。
它是 C 语言中判断字符串非空的标准做法,等价于:
if (str && str[0] != '\0') {//判断安全后进行下一步操作
}2、性能对比:str[0] vs strlen
(1)str[0]方式时间复杂度O(1),效率更高
只需要访问1个字节,适用于不需要获取字符串长度,快速判断字符串是否为空的情况。
(2)使用 strlen 判断非空
需要遍历整个字符串直到遇到 '\0',统计字符串长度。
时间复杂度为O(n),n 为字符串长度;内存访问量是 n 个字节。
适用于需要获取字符串长度时,可以使用这种方式,顺便获取出来字符串长度。
三、结论
综上所述,判断字符串为空,优选选择str && str[0] 安全且高效的非空判断方式;strlen(str) > 0 虽然功能相同,但性能依赖于字符串长度。
