使用等于运算符==在C中比较两个字符串的相等性
int main (int argc, **argv) { if (argv[1] == "-hello") printf("True\n"); else printf("False\n"); }
#。/ myProg -hello 假
为什么? 我意识到strcmp(argv[1], "-hello") == 0
返回true …但为什么我不能使用相等运算符来比较两个C字符串?
因为argv[1]
(例如)实际上是指向字符串的指针。 所以你所做的只是比较指针。
你无法将C中的字符串与==进行比较,因为C编译器并不真正了解字符串之外的字符串。
编译器在任何一方都看到与char*
的比较,因此它进行指针比较(比较存储在指针中的地址)
在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" */;
因为没有C字符串这样的东西。
在C中,字符串通常是char数组,或指向char的指针(几乎相同)。 将指针/数组与const数组进行比较将不会产生预期的结果。
更新:我的意思是’没有C字符串’,C中没有字符串。通常所说的’C字符串’是与语言无关的(如’Pascal字符串’),它是字符串表示为null – 终止的线性字符数组。
在C中,字符串值(包括字符串文字)表示为char
数组,后跟0终止符,您不能使用==
运算符来比较数组内容; 语言根本没有定义操作。
除非它是sizeof
或&
运算符的操作数,或者当它是用于初始化声明中的另一个数组的字符串文字时,类型为“N元素数组T”的表达式将隐式转换其类型( decay)键入“指向T的指针”,表达式的值将是数组第一个元素的地址。
所以当你写作
if (argv[1] == "-hello")
编译器隐式将表达式"-hello"
从类型“7-element array of char”转换为“指向char的指针”( argv[1]
已经是指针类型),表达式的值是字符的地址 '-'
。 那么==
结束比较的是两个指针值,它们(很可能)永远不会相等,因为"-hello"
和argv[1]
(很可能)占据内存中的不同区域。
这就是为什么你必须使用像strcmp()
这样的库函数来比较字符串值的原因。
因为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 }
字符串不是C中的本机类型。您在该示例中比较的是两个指针。 一个是你的第一个参数,另一个是静态字符数组,内容为“-hello”。
你真的想使用strncmp或类似的东西。
当你使用==时,你正在比较指针。 也就是说,如果两个操作数引用内存中的相同字符串,它将返回true。 因此,它不适合用于按字典顺序比较字符串。
因为C字符串是字符数组。 数组只是指向数组中第一个元素的指针,当你使用==比较两个指针时,它会比较它们指向的内存地址,而不是它们指向的值。