如何检查char*变量是否指向空字符串?

74

如何检查 char* 变量是否指向空字符串?

7个回答

127

检查第一个字符是否为 '\0'。同时,你也应该检查指针是否为 NULL。

char *c = "";
if ((c != NULL) && (c[0] == '\0')) {
   printf("c is empty\n");
}
你可以将这两个检查放在一个函数中,以便于重复使用。
编辑: if语句的意思是,“如果c不为零且字符数组'c'的第一个字符不为'\0'或零,则...”。 &&仅仅是组合了这两种条件。它基本上像在说:“如果这个和那个都成立,那么就...”。
if (c != NULL) { /* AND (or &&) */
    if (c[0] == '\0') {
        printf("c is empty\n");
    }
}

如果您对此不清楚,可能需要一本好的C编程书籍。我可以推荐一本名为“C程序设计语言”的书。

与上述相等的最短版本如下:

if (c && !c[0]) {
  printf("c is empty\n");
}

@Zack:c && c[0] 是什么意思?你能解释一下吗? - Aan
个人而言,我会将空指针的检查与空字符串的检查分开;这两者并不是真正相关的。 "更具可移植性"可能并不是您想要表达的,因为您在此呈现的所有代码都是有效的C语言(以及C ++)。 - Mark Ransom
11
如果我在审核代码时看到你写的是 c != NULL 而不是 c,那么你会被扣分。因为只要 c 是一个指针,这两种写法是完全相同的,而更短的形式是标准的 C 习惯用语。非惯用语形式只有在你想引起读者对某些有趣的事情的注意时才应该使用,但在这里没有什么有趣的事情发生,所以应该使用惯用语。 - zwol
4
比您的“最短版本”还要短一个字符,就是if (c && !*c) - Mark Ransom

15

我偏爱的方法:

if (*ptr == 0) // empty string

可能更为常见:

if (strlen(ptr) == 0) // empty string

8
请注意,第二种“更常见”的可能性也是不必要的缓慢。 - jpalecek
4
如果你不习惯第一种形式,那么这个速度慢的问题通常并不重要,使用 strlen 会更容易理解。请注意,翻译后的内容不能改变原文的意思。 - Mark Ransom
@Adban,在这个网站上,感谢别人最好的方式是点击答案旁边的向上箭头 :) - Mark Ransom
1
@MarkRansom:你并没有问我任何问题哈!:) 加一。 - Aan
如果 ptr 是空的呢? - Romário
4
问题明确要求“指向空字符串”,所以这就是我回答的问题;一个空指针是完全不同的事情。你可以将空指针的测试与我上面给出的其他测试组合起来,如果你把它放在第一位,短路规则会防止你引用空指针。if (ptr == nullptr || *ptr == 0) - Mark Ransom

9

检查指针是否为NULL,然后使用strlen来查看它是否返回0
NULL的检查非常重要,因为将NULL指针传递给strlen会引发未定义行为


6
一个空字符串只包含一个null字节。所以测试条件为:if (s[0] == (char)0)

5
不需要进行(char)转换。 - Jens

2
if (!*ptr) { /* empty string  */}

同样地
if (*ptr)  { /* not empty */ }

1
@igraczech,嗯,这应该适用于 char str = ""; 的情况。如果(! str),{printf(“empty \n”);}。我错过了一些微妙的情况吗? - alvin
抱歉,你是对的 - 这是我的愚蠢的C指针疏忽。我的情况是str指向一个只包含'\0'的地址。因此指针(*str)是非空的,而值(由str指向的地址的内容)为空。 - igraczech

2

我更倾向于使用strlen函数,因为库函数是以最佳方式实现的。

因此,我会编写以下代码: if(strlen(p)==0) //空字符串


2
很棒的想法,让我们迭代整个字符串(对于你们来说,它可能有2GB大小),只为了找出它是否包含至少一个字符!</sarcasm> - Lily Ballard
3
@KevinBallard 你是对的,但没必要这么刻薄。 - marsh

1

给它一个机会:

尝试通过函数gets(string)获取字符串, 然后检查条件,即if(string[0] == '\0')


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