条件不落在C

时间:2018-02-09 16:22:23

标签: c

我正在输入fizzbuzz,它应该执行但它不是,然后我试着看看argv1中的什么,它在终端打印fizzbuzz !! 如果它有fizzbuzz那么为什么它不会落入if条件?

#include <stdio.h>
#include <stdlib.h>
#include "my_functions.h"

int main(int argc, char *argv[]){   

if (argc == 2)
    {   
        if (argv[1] == "fizzbuzz")
        {
        printName();
        checkArgument(argc,argv);
    }

    else
    {
        printf("%s\n", argv[1]);
    }
    }
    else
    {
        printf("Incorrect\n");
    }   
    return 0;
}

1 个答案:

答案 0 :(得分:0)

你比较了地址。字符串文字是一个字符数组,在这里衰减为指向第一个元素的指针。你比较了他们当然不是你的意图。请改用strcmp(或strncmp之类的类似函数)。

if( strcmp(argv[1],"fizzbuzz") == 0 ){
     ...
}

我声称字符串文字是char的数组来自标准§6.4.5¶6 C11标准N1570

  

在转换阶段7中,将值为零的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列.78)然后使用多字节字符序列初始化静态存储阵列持续时间和长度恰好足以包含序列。对于字符串文字,数组元素的类型为char,并使用多字节字符序列的单个字节进行初始化

此衰退§6.3.2.1¶3 C11标准N1570

  

除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,是一个表达式类型'array of type'被转换为类型为'指向类型的指针'的表达式,指向数组对象的初始元素而不是左值。如果数组对象具有寄存器存储类,则行为为未定义。

同样,由于它们是不同的对象,显然情况是它们不会与if语句条件求值为false的结果相同,而不管您作为main函数的参数传递的内容

使用strcmp - 您基本上包含带有传递参数的数组内容,直到找到\0。当您想要比较字符串时,这显然是您想要做的。

记住相等或不平等中比较不相关对象的指针时,没有未定义的行为。但是如果你检查6.5.3p5,你会看到

  

将指针与>>=<<=进行比较,然后如果指针未指向同一对象,则行为未定义。