目前我有一个代码将参数传递给main,我使用strstr工具来查看传递给它的参数或字符串是否是彼此的子集。如果不是,我收到消息(null)。但是,当我尝试利用if语句来利用它时,它似乎没有激活?
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i;
for(i=1; i<argc; i++)
{
printf("%s\n", argv[i]);
}
printf("\n");
char *chant;
chant = strstr(argv[1], argv[2]);
printf("The subtring is: %s\n", chant);
if(chant==NULL)
{
printf("good bye");
}
return 0;
}
因此,如果我输入类似hello helloow的内容,它会说“子字符串是:( null)”,并且从那里我希望我的if语句激活并打印“再见”。当strstr找不到子字符串时,是不是chant为NULL?我知道我的if语句语法有问题,但不确定&gt; ....
我也试过这个:
if(*chant!=NULL)
但是它给了我关于指针和整数的比较错误。
编辑:
我不知道为什么,但似乎如果我使用GCC而不是CC来共同使用它会起作用..这很奇怪..
答案 0 :(得分:3)
printf()
期望与char*
匹配的有效(非NULL)%s
。传递(char*)NULL
是技术上未定义的行为。 glibc printf()
,由于可能不好的原因,决定对它们“未定义的行为”意味着打印“(null)”。
但是C编译器看到你取消引用指针,然后 检查它是否为NULL。编译器可以自由地得出结论,因为你已经取消引用了那个指针,并且世界还没有结束,那么指针不是 NULL,所以它删除了if(!chant){//can't happen}
。< br />欢迎来到C.
要获得已定义的行为,您可以使用以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
if (argc < 3)
exit(EXIT_FAILURE); //to avoid passing a NULL-ptr to printf()/strstr()
int i;
for(i=1; i<argc; i++)
{
printf("%s\n", argv[i]);
}
printf("\n");
char *chant;
chant = strstr(argv[1], argv[2]);
printf("The subtring is: %s\n", chant?chant:"(null)");
//prints "(null)" when substring not found, substring otherwise
if(chant==NULL)
{
printf("good bye");
}
return 0;
}