代码如下:
#include<stdio.h>
int is_legal(char* name)
{
if(!name)
return -1;
else
return 0;
}
int main()
{
char* test_name='\0';
printf("is legal return value : %d\n",is_legal(test_name));
return 0;
}
给了我结果:
is legal return value : -1
如果将字符串分配给test_name
,它会给我一个返回值零,这确实意味着if(!name)
为假。
是否有任何方案,除了将test_name
分配给'\0'
,我将if(!name)
视为真。
if(!name)
是标准做法,检查字符串是否为空?
答案 0 :(得分:2)
当指针被强制转换为布尔值时,结果为:
如果指针为NULL,则为false(0)
否则
将boolean not运算符(!
)应用于指针会强制转换为布尔值,然后反转结果值。
此外,指向空字符串char*
的""
指针不是 NULL指针。
在测试中,您设置了char* test_name = '\0';
,这意味着char* test_name = 0;
,因为NULL = 0(对于大多数但不是所有编译器),您test_name
是一个NULL指针。
另一方面,如果你创建char* test_name = "\0";
(带双引号),结果将是一个指向空字符串的指针,但仍然,指针test_name
本身不是NULL指针。
要检查char *指针是否有效以及指向的字符串是否为空,您可以执行以下操作:
`if(test_name && *test_name)` // valid pointer and non-empty string
或否定:
if((test_name == NULL) || (*test_name == '\0')) // invalid pointer or empty string
答案 1 :(得分:1)
if(!name)
往往会检查您的案例(!0)
if(1)
是否为真。
并且
char* test_name='\0';
应该是
char* test_name=NULL;
如果您想进入是否有任何方案,除了将test_name分配给&#39; \ 0&#39;,我得到if(!name)为true。
name
条件, non zero
必须为if
if(!name)是否是检查字符串是否为空的标准做法?
没有。它只是一种检查字符串是否为空的方法。
答案 2 :(得分:1)
你混合了2件事:NULL指针和字符串nul \0
终止。
char * nonExistent = NULL; // Pointer doesn't point to string
char * emptyString = ""; // Pointer points to empty string (array with one element \0)
is_legal(nonExistent); // Returns -1
is_legal(emptyString); // Returns 0
在您的情况下,\0
是整型常量0
,在分配给指针时会被解释为NULL指针。所以它有效,但是不正确。
测试字符串是非NULL还是非空的典型方法是:
char * str = ...
if(str && *str) { // First check is for NULL pointer, seconds tests for \0 in first element of string
printf("String exists and is not empty");
答案 3 :(得分:0)
如果is_legal()
是NULL指针,则函数-1
将返回name
。 if (!name)
在功能上等同于if (name == 0)
。
问题是,可以通过将零的整数值转换为指针来形成空指针。字符\0
是一个整数值,数值为零,所以
char* test_name='\0';
会将test_name
初始化为空指针。这解释了你看到的输出。
大多数编译器会警告这样做(假设您将编译器配置为最大化警告级别),因为将类型char
(值\0
)的值转换为指针是一种可疑行为。< / p>