我应该对if语句进行哪些正确的更改以使其激活?

时间:2014-10-04 21:02:23

标签: c

目前我有一个代码将参数传递给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来共同使用它会起作用..这很奇怪..

1 个答案:

答案 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;
}