如何检查scanf返回的字符串是否为null

时间:2014-03-02 11:13:29

标签: c string null compare

我正在使用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()

2 个答案:

答案 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)

显然,如果您需要测试两者,请测试第一个和第二个,因为如果stringNULL,第二个将取消引用空指针。

答案 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. */