【问题标题】:strcmp and double equal relational operator not working in Cstrcmp 和双相等关系运算符在 C 中不起作用
【发布时间】:2019-12-09 07:07:16
【问题描述】:

在 C 中使用以下程序,字符串比较不起作用:

#include<stdio.h>
#include<string.h>
int main(){
    char ch[]="ABC";
    printf("%d \n", strlen(ch));    // output 3
    printf("%d \n", strlen("ABC")); // output 3
    if(strcmp("ABC",ch)){
        printf("\n Matched");
    }else{
        printf("\n Not matched"); // this will be output
    }

    if("ABC" == ch){
        printf("\n Matched");
    }else{
        printf("\n Not matched"); // this will be output
    }
}//ends main

输出是:

3

3

 Not matched

 Not matched

为什么字符串不匹配?

【问题讨论】:

  • 坦率地说,所有这些都应该通过任何体面的书籍、教程或课程来解释。
  • 另外,strlen 函数返回一个 size_t 类型的值,其正确的 printf 格式说明符是 %zu。参数类型和格式说明符不匹配导致undefined behavior

标签: c string string-comparison


【解决方案1】:

"ABC" == ch 比较两个指针,而不是比较指针指向的内容。而且这两个指针永远不会相等。

如果字符串相等,strcmp 函数将返回 zero。在 C 中,零被认为是“假”,所有非零值都是“真”。


C 中的字符串文字实际上是(只读)字符数组,包括终止符。与所有数组一样,当它们在大多数表达式中使用时,它们会衰减为指向其第一个元素的指针。

【讨论】:

  • BUT "ABC" == "ABC" 返回 TRUE 为什么 ch == ch2 返回 FALSE(这里是 char ch[]="ABC" 和 char ch2[]="ABC"):
  • @mhk chch2 是不同的变量,每个变量都有不同的地址,所以它们不能相同。当您编写"ABC" 时,它可能会或可能不会与"ABC" 的另一个实例引用相同的内存位置(编译器可以选择)
  • @mhk 编译器只允许存储字符串文字的单个副本。所以"ABC" 都是完全相同的字符串文字,因此比较指向它们的指针将被认为是相等的。如果你有两个不同的数组,它们存储在不同的位置,指向它们的指针或者它们的内容也会不同。
【解决方案2】:

如果您将双引号更改为单引号,它将起作用:“ABC”到“ABC”

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多