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

时间:2010-10-14 13:27:35

标签: c string pointers equality equality-operator

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 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:12)

你无法将C中的字符串与==进行比较,因为C编译器并不真正了解字符串之外的字符串。

编译器会看到与任何一方的char*的比较,因此它会进行指针比较(比较存储在指针中的地址)

答案 2 :(得分:11)

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" */;

答案 3 :(得分:7)

因为没有C字符串这样的东西。

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

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

答案 4 :(得分:5)

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

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

所以当你写

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

编译器隐式将表达式"-hello"从类型“7-element array of char”转换为“指向char的指针”(argv[1]已经是指针类型),并且表达式的值为字符'-'地址。那么==结果比较的是两个指针值,它们(很可能)永远不会相等,因为"-hello"argv[1](最有可能)占用记忆中的不同区域。

这就是您必须使用strcmp()之类的库函数来比较字符串值的原因。

答案 5 :(得分:3)

因为C字符串不存在。它们是以\0结尾的char数组。

等于运算符==将测试指向数组第一个元素的指针是否相同。它不会按字典顺序进行比较。

另一方面,"-hello" == "-hello" 可能返回非零值,但这并不意味着==运算符会比较词典。这是由于其他事实。

如果你想比较词典编纂,你可以随时

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

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

 std::string arg1 ( argv[1] );

 if (arg1 == "-hello"){
    // yeahh!!!
 }
 else{
    //awwwww
 }

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

当你使用==时,你正在比较指针。也就是说,如果两个操作数引用内存中的相同字符串,它将返回true。因此,它不适合用于按字典顺序比较字符串。

答案 8 :(得分:-1)

因为C字符串是字符数组。数组只是指向数组中第一个元素的指针,当你使用==比较两个指针时,它会比较它们指向的内存地址,而不是它们指向的值。