C语言中使用==比较字符串结果不符的原因解析
为什么用
==比较C语言字符串会得到"unequal"而strcmp却能正确判断相等? 你猜的完全没错!问题根源就是str1和str2的内存地址不一样,而==在比较字符串的时候,根本不是在比内容,而是在比指针的地址。
先搞懂==比较字符串的本质
在C语言里,没有原生的"字符串"数据类型,我们平时用的字符串其实是字符数组或者指向字符的指针。当你用==比较str1和str2的时候:
- 对于数组形式的
char str1[] = "xxx",数组名str1会被隐式转换成指向数组第一个元素的指针(也就是数组的首地址)。 - 所以
str1 == str2实际在做的是:比较两个数组的首地址是否相同,而不是比较数组里的字符内容。
看你的代码具体情况
你的代码里:
#include<stdio.h> int main() { char str1[] = "ComputerProgram"; char str2[] = "ComputerProgram"; (str1==str2)? (printf("Equal")):(printf("unequal")); return 0; }
这是两个独立的字符数组,编译器会在栈上给它们分配两块完全不同的内存空间,然后把"ComputerProgram"这个字符串分别复制到这两块空间里。所以str1指向的是第一块内存的起始地址,str2指向第二块的起始地址——这两个地址肯定不一样,所以==判断的结果就是false,自然打印"unequal"。
那strcmp为什么能正确判断?
strcmp是标准库专门用来逐字符比较字符串内容的函数,它的工作逻辑是:
- 从两个字符串的首字符开始,逐个比较对应位置的字符ASCII值
- 如果遇到不同的字符,就返回两个字符的差值;如果一直到字符串末尾('\0')都完全相同,就返回0
所以strcmp(str1, str2) == 0就表示两个字符串的内容完全相等,这才是判断字符串内容是否相同的正确方式。
补充一个容易混淆的情况
如果你写成指针形式的字符串常量:
char *str1 = "ComputerProgram"; char *str2 = "ComputerProgram";
这时候str1 == str2可能会返回true——因为很多编译器会做优化,把相同的字符串常量存到同一个内存区域,让两个指针指向同一个地址。但这种行为是编译器相关的,完全不可靠!哪怕看起来能工作,也绝对不能用==来判断字符串内容相等,必须用strcmp才是标准、可移植的写法。
内容的提问来源于stack exchange,提问作者Blazingminds Ggn
相关产品推荐
相关产品推荐

