了解C中的Char数组相等性

时间:2015-02-11 05:01:41

标签: c arrays char

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

所以在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

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

5 个答案:

答案 0 :(得分:3)

if (a == b)

这里是比较指针而不是字符串

strcmp(a, b)

您在这里比较字符串

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

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

例如:

#include <stdio.h>

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()来比较字符串。

答案 1 :(得分:2)

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

所以如果你有a

  a //say at some random address 1000 

b

  b //say at some random address 2000 

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

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

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

希望它有所帮助!!