Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查scanf返回的字符串是否为null_C_String_Null_Compare - Fatal编程技术网

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

如何检查scanf返回的字符串是否为null,c,string,null,compare,C,String,Null,Compare,我正在使用scanf()从用户处读取输入字符串。 我想检查此字符串是否为空(\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

我正在使用
scanf()从用户处读取输入字符串。

我想检查此字符串是否为空(\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);
}
#包括
char*参数;//mycat的论据
scanf(“%s”,参数(&F);
if(fork()==0)//at child
{
printf(“子进程:即将执行\“mycat%s\”\n、&argument”);
fflush(stdout);

if(strcmp(argument,“”==0)/
NULL
\0
不是一回事,尽管它们的计算结果都为零。
NULL
是指针零,也就是说,它是我们用来表示空指针的。
\0
是ASCII数字为零的字符,也称为
NUL
(一个“L”),即是值为0的
char

char*
NULL
(即内存中根本没有字符串)或字符串为空(即仅包含一个
char
,即
\0
,也称为
NUL
)之间存在重要区别

要进行第一次测试,请执行以下操作:

if (!string)
或者,如果您想更详细一些:

if (string == NULL)
if (string[0] == 0)
要进行第二次测试,请执行以下操作:

if (!string[0])
或者,如果您想更详细一些:

if (string == NULL)
if (string[0] == 0)

显然,如果您需要同时测试这两个,那么先测试第一个,然后测试第二个,因为如果
string
null
null
\0
都计算为零,那么第二个将取消对空指针的引用。
null
是指针零,也就是说,它是我们用于空点的ter.
\0
是ASCII数字为零的字符,也称为
NUL
(一个“L”),即值为0的
char

char*
NULL
(即内存中根本没有字符串)或字符串为空(即仅包含一个
char
,即
\0
,也称为
NUL
)之间存在重要区别

要进行第一次测试,请执行以下操作:

if (!string)
或者,如果您想更详细一些:

if (string == NULL)
if (string[0] == 0)
要进行第二次测试,请执行以下操作:

if (!string[0])
或者,如果您想更详细一些:

if (string == NULL)
if (string[0] == 0)

显然,如果您需要同时测试这两个,那么先测试第一个,然后测试第二个,因为如果
string
null
null
\0
都计算为零,那么第二个将取消对空指针的引用。
null
是指针零,也就是说,它是我们用于空点的ter.
\0
是ASCII数字为零的字符,也称为
NUL
(一个“L”),即值为0的
char

char*
NULL
(即内存中根本没有字符串)或字符串为空(即仅包含一个
char
,即
\0
,也称为
NUL
)之间存在重要区别

要进行第一次测试,请执行以下操作:

if (!string)
或者,如果您想更详细一些:

if (string == NULL)
if (string[0] == 0)
要进行第二次测试,请执行以下操作:

if (!string[0])
或者,如果您想更详细一些:

if (string == NULL)
if (string[0] == 0)

显然,如果您需要同时测试这两个,那么先测试第一个,然后测试第二个,因为如果
string
null
null
\0
都计算为零,那么第二个将取消对空指针的引用。
null
是指针零,也就是说,它是我们用于空点的ter.
\0
是ASCII数字为零的字符,也称为
NUL
(一个“L”),即值为0的
char

char*
NULL
(即内存中根本没有字符串)或字符串为空(即仅包含一个
char
,即
\0
,也称为
NUL
)之间存在重要区别

要进行第一次测试,请执行以下操作:

if (!string)
或者,如果您想更详细一些:

if (string == NULL)
if (string[0] == 0)
要进行第二次测试,请执行以下操作:

if (!string[0])
或者,如果您想更详细一些:

if (string == NULL)
if (string[0] == 0)

显然,如果您需要同时测试这两个,请先测试第一个,然后测试第二个,因为如果
string
null
,则第二个将取消对空指针的引用以回答问题:

检查的返回值以测试操作是否成功,请读入一些内容

例如,如果未读取任何内容,则返回
0
;如果未读取任何内容或发生错误,则返回
EOF


但是,示例代码存在以下问题:

第1期:

只是指向“某处/无处”的指针。读取非斜体变量会调用未定义的行为,将数据复制到“无处”也会调用未定义的行为

要解决此问题,请为其分配一些内存,例如:

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

第二期:

尝试将数据扫描到
参数
地址,而不是它所指向的位置(如果是)

要解决这个问题,请执行以下操作:

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

要回答这个问题:

检查的返回值以测试操作是否成功,请读入一些内容

例如,如果未读取任何内容,则返回
0
;如果未读取任何内容或发生错误,则返回
EOF


但是,示例代码存在以下问题:

第1期:

只是指向“某处/无处”的指针。读取非斜体变量会调用未定义的行为,将数据复制到“无处”也会调用未定义的行为

要解决此问题,请为其分配一些内存,例如:

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

第二期:

尝试将数据扫描到
参数
地址,而不是它所指向的位置(如果是)

要解决这个问题,请执行以下操作:

scanf("%s", argument);
或者更好的方法是,也告诉
scanf()
要读取的缓冲区的大小,这样它就不会溢出缓冲区