了解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)
将执行此操作将比较存储在a
和b
指针值。
所以,如果你有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)。
希望能帮助到你 !!