我正在使用scanf().
我想检查这个字符串是否为NULL(\ 0)。
这是我的代码:
#include<stdio.h>
char *argument; // argument for mycat
scanf("%s", &argument);
if(fork()==0) // at child
{
printf("Child process: about to execute \"mycat %s\"\n", &argument);
fflush(stdout);
if(strcmp(argument, "") == 0) // <-- Here is the problem
{
execlp("mycat", "mycat", &argument, NULL); // execute child process
}
execlp("mycat","mycat", NULL);
}
我正在使用Red Hat 6.1上的g ++编译器进行编译
修改:问题在于,我无法取消引用argument
if
语句,甚至无法取消引用strlen()
。
答案 0 :(得分:3)
NULL
和\0
不是一回事,尽管它们都评估为零。 NULL
是一个指针零,即它是我们用于空指针的东西。 \0
是ASCII数字为零的字符,也称为NUL
(一个'L'),即值为0的char
。
char *
NULL
之间存在重要差异(即内存中根本没有字符串),或者字符串为空(即只包含一个char
是\0
,也称为NUL
)。
测试第一个:
if (!string)
或者如果你想更加冗长:
if (string == NULL)
测试第二个:
if (!string[0])
或者如果你想更加冗长:
if (string[0] == 0)
显然,如果您需要测试两者,请测试第一个和第二个,因为如果string
为NULL
,第二个将取消引用空指针。
答案 1 :(得分:0)
回答这个问题:
检查scanf()
的返回值以测试操作是否成功,读入内容。
对于您的示例,如果没有读取任何内容,它将返回0
;如果没有任何内容可读或发生错误,则返回EOF
。
但是示例代码存在问题:
1 st 问题:
char *argument; // argument for mycat
只是一个指向“某处/无处”的指针。读取未经传播的变量会调用未定义的行为,将数据复制到“无处”也会调用未定义的行为。
要解决此问题,请通过以下方式为其分配一些内存:
char * argument = malloc(42); /* Allocate 41+1 bytes, that is room for a C-"string"
being 41 characters long. */
strcpy(argument, ""); /* Initalise it to an emtpy string. */
2 nd 问题:
scanf("%s", &argument);
尝试将数据扫描到argument
的地址,而不是指向它的位置(如果是)。
要解决此问题
scanf("%s", argument);
甚至更好,也告诉scanf()
大小是否要读入缓冲区,因此它不会溢出它。假设上述初始化,那将是:
scanf("%41s", argument); /* Read one less then there is room, as the 42nd char is used to hold the '0'-terminator. */