【问题标题】:Understanding Char Array equality in C理解 C 中的 Char 数组相等性
【发布时间】:2015-04-11 09:15:00
【问题描述】:

提前对我的无知表示歉意。我不完全理解如何比较 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

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

【问题讨论】:

    标签: c arrays char


    【解决方案1】:
    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() 来比较字符串。

    【讨论】:

    • 值得补充的是,如果字符数组不是一个字符串(即不是空终止),那么memcmp 更合适。
    【解决方案2】:

    这样做if (a == b) 将比较存储在ab 中的指针值。

    所以如果你有a

      a //say at some random address 1000 
    

    b

      b //say at some random address 2000 
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        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)。

        【讨论】:

        • NULL 是一个空指针常量。它不应该用于引用空字符'\0'
        【解决方案5】:

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

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

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

        希望对你有帮助!!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-22
          • 2018-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 2010-12-25
          相关资源
          最近更新 更多