代码之家  ›  专栏  ›  技术社区  ›  Carlo del Mundo

使用相等运算符==比较两个字符串在C中的相等性

  •  12
  • Carlo del Mundo  · 技术社区  · 16 年前
    int main (int argc, **argv)
    {
           if (argv[1] == "-hello")
                printf("True\n");
           else
                printf("False\n");
    }
    
    # ./myProg -hello
    False
    

    为什么?我意识到 strcmp(argv[1], "-hello") == 0 返回true。。。但是为什么我不能使用相等运算符来比较两个C字符串呢?

    9 回复  |  直到 8 年前
        1
  •  18
  •   Oliver Charlesworth    16 年前

    argv[1] (例如)实际上是指向字符串的指针。所以你所做的就是比较指针。

        2
  •  14
  •   Bart van Ingen Schenau    16 年前

    char* 在任何一边,它都进行指针比较(比较指针中存储的地址)

        3
  •  12
  •   pmg    10 年前

    在 C 因为,在大多数情况下,数组“衰减为指向其第一个元素的指针”。

    所以,当你有阵列的时候 "foobar"

    if (name == "foobar") /* ... */; /* comparing name with a pointer */
    

    你想要它比较什么 具有 某物

    if ('p' == *("foobar")) /* ... */; /* false: 'p' != 'f' */
    if ('m' == *("foobar"+1)) /* ... */; /* false: 'm' != 'o' */
    if ('g' == *("foobar"+2)) /* ... */; /* false: 'g' != 'o' */
    

    或自动

    if (strcmp(name, "foobar")) /* name is not "foobar" */;
    
        4
  •  7
  •   jv42    16 年前

    因为没有C字符串。

    在C语言中,字符串通常是char数组或char指针(几乎相同)。将指针/数组与常量数组进行比较不会得到预期的结果。

    更新:我所说的“没有C字符串”是指C中没有字符串。通常所说的“C字符串”与语言无关(如“Pascal字符串”),它是字符串作为以空结尾的线性字符数组的表示。

        5
  •  5
  •   John Bode    16 年前

    在C语言中,字符串值(包括字符串文本)表示为 char 后跟0终止符,并且不能使用 == 比较数组内容的运算符;该语言不定义该操作。

    sizeof 或 & 运算符,或者当它是用于在声明中初始化另一个数组的字符串文字时,类型为“N-element array of T”的表达式将其类型隐式转换(衰减)为类型“pointer to T”,表达式的值将是数组的第一个元素的地址。

    if (argv[1] == "-hello")
    

    编译器隐式转换表达式 "-hello" argv[1] 已经是指针类型),表达式的值为 地址 性格的 '-' . 那又怎么样 == 指针 价值观,从 和 (很可能)在记忆中占据不同的区域。

    strcmp()

        6
  •  3
  •   Tom    16 年前

    因为C字符串不存在。它们是以 \0 .

    == 将测试指向数组第一个元素的指针是否相同。它不会在词汇上进行比较。

    另一方面 "-hello" == "-hello" 可以 == 运算符按字典顺序比较。那是因为其他的事实。

    如果你想在词典学上进行比较,你可以

    #define STR_EQ(s1,s2)    \
       strcmp(s1,s2) == 0
    

    更努力的阅读我看到你标记为c++。所以你可以

     std::string arg1 ( argv[1] );
    
     if (arg1 == "-hello"){
        // yeahh!!!
     }
     else{
        //awwwww
     }
    
        7
  •  2
  •   kanaka    16 年前

    字符串不是C中的本机类型。在该示例中比较的是两个指针。一个是第一个参数,另一个是包含“-hello”内容的静态字符数组。

    你真的想用strncmp或类似的东西。

        8
  •  1
  •   waffle paradox    16 年前

    当您使用==时,您在比较指针。也就是说,如果两个操作数引用内存中的同一字符串,则返回true。因此,它不适合在词汇上比较字符串。

        9
  •  0
  •   Anthony    16 年前