了解C中的Char数组相等性

提前抱歉无知。 我不完全理解如何比较C中的char数组。我最初将c中的两个char数组与simple ==运算符进行比较。

所以在C函数中,我会做这样的事情。

 char *a = "test"; char *b = "test"; if (a == b) ..do something 

但我读到我应该使用strcmp而不是==这样。

 char *a = "test"; char *b = "test"; if (0 == strcmp(a, b)) ..do something 

哪一个是正确的,为什么? 另一个人在做什么?

 if (a == b) 

在这里,您要比较指针而不是字符串

 strcmp(a, b) 

在这里你要比较字符串

 Which one is correct and why? What is the other one doing? 

由于有两个字符串存储在不同的内存位置,或者如果存储相同的字符串,则有可能a==b比较指针没有意义。你想要的是比较指针所指向的位置的内容。 这是由strcmp()完成的,这是比较字符串的正确方法。

例如 :

 #include  int main(void) { char *a = "test"; char *b = "test"; printf("%p\n %p",(void *)a,(void *)b); return 0; } 

输出是

 0x8048540 0x8048540 

所以指针a和b都指向相同的内存位置a==b注意,这里我们比较的不是字符串中的实际字符,而只是指针。

我在另一台机器上运行相同的代码,并且存储此字符串的位置不同。

 0x4005f8 0x4005fd 

所以现在即使字符串可能相同,你也会看到a != b 。 因此使用strcmp()来比较字符串。

if (a == b)将执行此操作将比较存储在ab指针值。

所以,如果你有a

  a //say at some random address 1000 

b

  b //say at some random address 2000 

a==b ? 现在通常情况下,如果编译器正在进行字符串池化,并且如果你的字符串文字完全相同,那么这可能适用于那些情况 – 否则你必须按照strcmp进行逐字符比较。

我建议使用strcmp,因为它比较字符串的内容,而==比较字符串中第一个元素的地址。

另外,strcmp会告诉你字符串的相对顺序,而不是简单地说它们是否相等。

字符串文字存储在内存的文本(只读)段中的连续内存位置。

 char *a = "test"; char *b = "test"; if (a == b) ..do something 

在这里,您要比较数组的第一个元素的地址。 这可以导致相等,因为"test ”是存储在存储器的文本段中的String,而*a and *b可能指向该存储器位置。

 char *a = "test"; char *b = "test"; if (0 == strcmp(a, b)) ..do something 

在这里,您将逐字节地比较两个数组的每个元素,直到达到任何一个输入数组的NULLCHAR(\ 0)。

if(a == b)将比较存储在a和b指针中的地址。

strcmp(a, b)将比较存储在a和b地址的内容的字符。 如果两个内容相同(区分大小写),则返回0。 否则字符的ASCII值不同

if(*a == *b)将比较两个数组的第一个字符(即第0个位置的char)。

希望能帮助到你 !!