20
int main (int argc, **argv)
{
       if (argv[1] == "-hello")
            printf("True\n");
       else
            printf("False\n");
}
# ./myProg -你好
错误的

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

4

9 回答 9

21

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

于 2010-10-14T13:30:38.230 回答
17

您不能将 C 中的字符串与 == 进行比较,因为 C 编译器实际上并没有关于字符串文字之外的字符串的线索。

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

于 2010-10-14T13:31:37.027 回答
14

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

因此,当您拥有该数组"foobar"并在大多数情况下使用它时,它会衰减为一个指针:

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

您希望它将数组的内容something进行比较。您可以手动执行此操作

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" */;
于 2010-10-14T13:36:19.077 回答
6

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

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

更新:我所说的“没有 C 字符串”的意思是,C 中没有字符串。通常所说的“C 字符串”与语言无关(就像“帕斯卡字符串”一样),它是将字符串表示为 null - 终止的线性字符数组。

于 2010-10-14T13:30:48.283 回答
5

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

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

所以当你写

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

编译器将表达式"-hello"从“7-element array of char”类型隐式转换为“pointer to char”(argv[1]已经是指针类型),表达式的值就是字符的地址'-'。所以==最终比较的是两个指针值,它们(很可能)永远不会相等,因为"-hello"并且argv[1](很可能)占据内存中的不同区域。

这就是为什么您必须使用诸如strcmp()比较字符串值之类的库函数。

于 2010-10-14T16:54:05.873 回答
3

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

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

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

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

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

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

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

 if (arg1 == "-hello"){
    // yeahh!!!
 }
 else{
    //awwwww
 }
于 2010-10-14T13:31:02.323 回答
2

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

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

于 2010-10-14T13:31:21.397 回答
1

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

于 2010-10-14T13:31:54.433 回答
0

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

于 2010-10-14T13:31:12.270 回答