检查字符数组是否为空的最佳方法

73

如何最可靠地检查字符数组是否为空?

char text[50];

if(strlen(text) == 0) {}
或者
if(text[0] == '\0') {}

还是我需要做什么?

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

最高效的方法是什么?


1
所以你想知道是否需要测试 null,还是需要将字符串设置为全 0,然后再测试是否为 0? - Jeremy L
是的,我不确定如果我只声明了一个字符串并且没有对它进行任何操作,我是否可以测试它是否为NULL。 - ZPS
7个回答

92

考虑以下代码:

char text[50];
if(strlen(text) == 0) {}

随后是关于此代码的问题:

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

我感觉有些混乱。具体来说,在这种情况下:

char text[50];
if(strlen(text) == 0) {}

如果没有初始化,text[] 的内容将是未定义的。因此,strlen(text) 将返回未定义的结果。

确保 C 字符串被初始化为空字符串最简单/最快的方法是将第一个字节设置为 0。

char text[50];
text[0] = 0;

从那时起,strlen(text)和非常快但不太直观的(text[0] == 0)测试都将检测到空字符串。


1
我结构化得很糟糕,我的意思是在char text [50] ;之后立即使用memset(text,0,sizeof(text));,因为我不确定在赋值之前对char数组使用strlen是否是不好的习惯。 - ZPS
1
在数组被分配之前对其进行strlen操作肯定是一个坏主意 - strlen函数会沿着内存向前移动,直到遇到一个0字节为止,这可能远远超出了数组的末尾。 - Graeme Perrow

22

这取决于你的数组是否保存了以null结尾的字符串,如果是,则

if(text[0] == '\0') {}

应该足够了。

编辑:另一种方法是...

if (strcmp(text, "") == 0)

这种方法可能不够高效,但它能清楚地表达你的意图。


对我来说,以下代码是有效的: 如果(text[0] == ''){返回 false;} 返回 true; - Amandeep Rohila

8
这将用于查找字符数组是否为空。这可能也是最快的方法。
if(text[0] == '\0') {}

如果text数组为空,这也会很快。如果它包含字符,则需要先计算其中所有字符的数量。
if(strlen(text) == 0) {}

2
不要使用strlen来测试C字符串是否为空。这不是一个常数时间操作。 - Thomas Eding
1
这就是我在答案中所解释的。 - Peter Stuifzand

4
第二种方法几乎肯定是测试一个以null结尾的字符串是否为空的最快方法,因为它只涉及一次读取和一次比较。在这种情况下,使用这种方法没有任何问题,所以你可以放心使用。
第三种方法不检查字符数组是否为空;它确保字符数组为空。

4
第二种方法是最快的。如果字符串确实为空,则使用 strlen 方法会很接近,但是 strlen 方法总是要遍历字符串的每个字符,因此如果它不为空,它将比你需要的做更多的工作。
正如詹姆斯所提到的,第三种方法在检查之前清除了字符串,因此检查将始终成功,但这将毫无意义。

2
if (text[0] == '\0')
{
    /* Code... */
}

如果你正在编写微控制器代码,且flash和/或RAM空间有限,则可以使用此方法。使用strlen将浪费很多flash空间,因此检查第一个字节是更好的选择。

以上示例是最快的方法,需要的计算量也较少。


0
if (!*text) {}  

上面的代码解引用指针“text”并检查它是否为零。或者:
if (*text == 0) {} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接