如何检查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()
要读取的缓冲区的大小,这样它就不会溢出缓冲区