这是我的代码,任何人都可以告诉我为什么当我在变量a
和b
中放入相同的值时,编译器会打印“两者都不相等”的消息。
(注意:我不想比较字符串,我只需要技术原因)。
#include<stdio.h>
main()
{
char a[3]="abc",b[3]="abc";
if(a==b)
printf("both are equal");
else
printf("both are not equal");
}
答案 0 :(得分:5)
C不进行字符串比较。它将比较指向数组开头的两个指针,它们永远不会相等。
使用strcmp()
比较字符串:
strcmp(a, b) == 0
求平等strcmp(a, b) != 0
for notquality strcmp(a, b) < 0
之前对a
排序的b
{li> strcmp(a, b) <= 0
之前a
排序等于b
strcmp(a, b) > 0
a
后b
排序
{li> strcmp(a, b) >= 0
a
之后或等于b
的排序
答案 1 :(得分:1)
a
和b
是数组,除 sizeof 和&
外,它们会衰减到指向数组第一个元素的指针,因为它们占据了不同的存储位置指针不相等。如果我们查看C99 draft standard部分6.3.2.1
Lvalues,数组和函数指示符段 3 表示(强调我的 ):
除非它是sizeof运算符或一元&amp;的操作数。运营商,或者是 用于初始化数组的字符串文字,具有类型''数组类型'的表达式 转换为类型为''指向类型'的指针的表达式,指向的初始元素 数组对象并且不是左值。如果数组对象有寄存器存储类,则 行为未定义。
C FAQ question 6.3也很好地涵盖了这个主题。
比较C样式字符串的正确方法是使用链接文档中的strcmp:
int strcmp( const char *lhs, const char *rhs );
,它被描述为:
比较两个以空字符结尾的字节字符串。比较是按字典顺序进行的。
具有以下返回值:
答案 2 :(得分:0)
因为他们的地址不同(请查看输出here),如果您打算比较他们的值,最好使用strcmp(a,b)
答案 3 :(得分:0)
数组的名称是它的地址,而不是它的内容,因此,两个不同的数组,无论内容如何,都会“误比较”。