我想知道str == NULL
和str[0] == '\0'
之间的区别:
int convert_to_float(char *str, double *num)
{
if ((str == NULL) || (str[0] == '\0'))
return(-1);
*num = strtod(str, (char **)NULL);
return(0);
}
我在Linux上使用gcc。
答案 0 :(得分:109)
str==NULL
告诉您指针是否为NULL。
str[0]=='\0'
告诉您字符串是否为零长度。
在该代码中,测试:
if ((str == NULL) || (str[0] == '\0'))
用于捕获NULL为零或长度为零的情况。
请注意,短路在这里起着关键作用:测试的目的是确保str
是长度至少为1的有效c字符串。
str[0] == '\0'
仅在str
不为NULL时才有效。str == NULL
为NULL时,需要第一次测试str
才能提前爆发。答案 1 :(得分:46)
重要的是要记住str
不是真正的“字符串”,而是指针到内存位置char
(a的一部分)字符串)存储。
接下来,我们必须了解编译器如何看待所有这些项目。我们来看看他们的类型:
str
的类型为char *
(字面意思是“指向char
的指针”)NULL
是一个空指针常量(至少在我的系统上,它是((void*)0)
)'\0'
是一个字符常量(它实际上是int
类型,但不要担心;它通常用于需要char
值的上下文中)请参阅*
和char *
中的void *
?这告诉编译器这些是指针类型(这是一种奇特的方式,说这种类型的变量不保持值,他们只是指向它)。因此,当编译器看到char *str
时,它知道您可能会要求执行*str
或str[0]
之类的操作(这两者都做同样的事情)。我们稍后会再回过头来看。
您可以看到,当您在C程序中编写str
时,编译器知道名为“str”的变量存储在内存位置,例如0x0001。它生成的代码转到0x0001并获取值。这样,如果你做了像
str + 1
然后编译器将生成类似于:
的代码fetch the value from where str is stored (0x0001)
add 1 to that value
我确定你知道这件事。所以现在应该明白这条线说的是什么:
str == NULL
由于NULL
是一个空指针常量,该行测试str
是否为空指针(即指向不指向任何内容的指针)。
因此编译器通常会生成如下代码:
fetch the value from where str is stored
check if that value is 0
现在请记住,如果您愿意,我们告诉编译器str
实际上是指针类型。所以我们允许写这个:
*str
这使得编译器生成了这个:
fetch the value from where str is stored
now use that value as a memory address and fetch what is stored there
因此,如果str保持0x0200,那么我们将从内存地址0x0200获取值。请注意,编译器并不关心字符串是否真正存储在那里。
(我假设你知道str[0]
与*str
相同。这样可以更容易地解释发生了什么。)
那怎么样呢?
*str == '\0'
这条线实际上是这样的:
*str == (char) 0
这使得编译器生成了这个:
fetch the value from where str is stored
now use that value like a memory address and fetch the char that is stored there
check if the value of that fetched char is 0
总结:
str == NULL
会告诉您指针str
是否指向。*str == '\0'
会告诉您指针str
是否指向空字符串(实际上,指向一个保持零的内存位置)。(根据定义,“字符串”是“由第一个空字符终止并包含第一个空字符的连续字符序列”,因此如果字符串的第一个字符为'\0'
,则字符串为空字符串。)
答案 2 :(得分:27)
基本上
str == NULL
确定str
是否为NULL
指针str[0] == '\0'
确定str
是否为0长度c样式字符串组合它们时,您正在检查它是NULL还是空。这允许函数在方法开始时消除两种形式的空数据
答案 3 :(得分:8)
str == NULL
检查str是NULL指针(指向无处的指针)
str[0] == '\0'
(如果不是NULL指针)检查第一个str元素有0值(没有字符的字符串只有0终止)
答案 4 :(得分:7)
str==NULL
告诉您字符串是否为NULL
。
*str=='\0'
告诉您字符串是否为零长度。
注意 :此答案是Mystical's 15 second answer上有str=='\0'
的游戏。当然,在前3或4分钟内所做的更改没有显示,他修正了ಠ_ಠ。
答案 5 :(得分:6)
str == NULL表示“str指向内存地址零”(或者系统上的任何地址为NULL)。通常这意味着根本没有字符串。
str [0] =='\ 0'表示“str的第一个字符是字符零”(表示字符串的结尾)。这意味着有一个字符串,但它是空的。想想空杯子而不是杯子;同样的想法。
在其他语言中,您可以撰写str == null
vs str == ""
。它们意味着两件事。理解C中的差异尤为重要,因为尝试使用NULL指针会使程序崩溃。
答案 6 :(得分:4)
str == NULL
这意味着字符串没有字符串的参考,因为它的指针是Null(表示字符串的地址为空)。
str[0] == '\0'
- 表示长度为0的字符串。
如果这个解释有任何问题或者您仍有疑问,请告诉我。
答案 7 :(得分:3)
str == NULL
表示str未指向任何地址=指针为空。
和str[0] == '\0'
str指向一个有效的地址,此行检查第一个字符(即str [0])是否为数字0(ascii值为'\ 0'),表示结束字符串。然后字符串是空的。 (str中没有字符:第一个是结束字符)
答案 8 :(得分:2)
1 - > str == NULL
确定str是否为NULL指针
2 - > str[0] == '\0'
确定str是否为0长度c样式字符串
所以在这
if ((str == NULL) || (str[0] == '\0'))
OR运算符的短路进入图像,因为它确保字符串不指向任何字符串或空字符串..
答案 9 :(得分:0)
C#相当于:
if (string.IsNullOrEmpty(str))
{
}
简单的含义是字符串是NULL还是空字符串。