比较字符串出错了

时间:2018-04-08 01:50:02

标签: c string comparison

我得到的输出不等你能解释一下为什么

#include <stdio.h>

int main()
{
    char str1[] = "hello";
    char str2[] = "hello";

    if (str1 == str2)
        printf("equal");
    else
        printf("unequal");

    return 0;
}

3 个答案:

答案 0 :(得分:3)

那是因为==正在比较str1str2的地址,而不是 字符串的内容。您必须使用strcmp

#include <stdio.h>
#include <string.h>
int main()
{
    char str1[]="hello";
    char str2[]="hello";
    if(strcmp(str1, str2) == 0)
        puts("equal");
    else
        puts("unequal");
    return 0;
}

将是正确的版本。见https://ideone.com/wJpL2I

请注意,在C中,字符串只是以字符串结尾的字符序列 '\0' - 终止字节。 str1str2都是数组,但是当你这样做时 str1 == str2他们腐烂成指针,你所比较的是记忆 数组存储在内存中的位置。它们是两个不同的阵列 (虽然它们具有相同的内容),所以它们的内存地址当然会有所不同,这就是你得到unequal的原因。这就是你需要的原因 strcmp函数用于比较char数组的内容。

答案 1 :(得分:1)

你正在比较数据容器的地址str1和str2,如果你知道java然后有equals方法和contentEquals方法,如果你使用equals方法它比较对象引用,但如果你做contentEquals它比较内容(数据)驻留在对象中。

在c中,您应该已经知道字符串的名称中包含基址。这就是你不需要放&(address of operator) while using the scanf这就是你做str1==str2时的灵魂原因,它比较了地址而不是字符串中的数据。

在c str1和str2中只是2个字符数组,最后有\0。现在当你做

if(str1==str2) //it compares the address of 
//variables not the content as 
//you are comparing the base address
//of the strings str1 and str2. 

正确的版本应该是:

#include <stdio.h>
#include <string.h>
int main()
{
char str1[]="hello";
char str2[]="hello";
if(strcmp(str1, str2) == 0)
    puts("equal");
else
    puts("unequal");
return 0;
}

如果你想验证你可以使用它,printf(“%d”, &str1); printf(“%d”, &str2);它们都不会相等。

答案 2 :(得分:0)

当你想比较两个字符串时,你实际上想要查看一个字符串中的每个字符是否都在另一个字符串的相应位置。

此处使用的字符串变量(str1 and str 2)只是指向这些字符串的基址的指针。

因此,str1 == str2意味着您只是在比较两个字符串是否具有相同的基址,当然这是不正确的。

在这里,您可以使用具有strcmp()或字符串比较功能的string.h文件。

它的工作方式如下: 它遍历字符串,并检查相应位置(相同索引值)中各个字符的ascii值的差异。如果所有字符都相同,则返回0.

否则,根据将字符串传递给strcmp的顺序会遇到正值或负值。

但在这种情况下,如果你得到正值或负值,那就不重要了。

用法:
if (!strcmp(str1, str2)) puts("equal"); else puts("unequal");