提前抱歉无知。我不完全理解如何比较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
哪一个是正确的,为什么?另一个人在做什么?
答案 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)
将比较a
和b
中存储的指针值。
所以如果你有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个位置的字符)。
希望它有所帮助!!