【问题标题】:Why is the == operator not yielding the same result as strcmp? [duplicate]为什么 == 运算符产生的结果与 strcmp 不同? [复制]
【发布时间】:2020-01-10 01:19:55
【问题描述】:

我创建了一个字符指针的二维数组。我想用它来创建一个字典,如果变量 ent 是字典的一部分,则检索该单词的相应字典条目(如果存在)。我目前正在使用 strcmp,但这只是因为 == 运算符让我很难过。我不确定为什么 == 运算符没有导致预期的结果。

我怀疑它可能与指针比较有关,因为我将一个指向字符串的指针与另一个指向字符串的指针进行比较,而不一定是它的内容。

#include <iostream>
#include <cstring>

int main() {
    char *dictionary[][2] {
        {"First","Monday"},
        {"Second","Tuesday"},
        {"Third","Wednesday"},
        {"Fourth","Thursday"},
        {"Fifth","Friday"},
        {"Sixth","Saturday"},
        {"Seventh","Sunday"},
        {"",""}
    };

    char ent[80] = "Sixth";

        for (int i{}; *dictionary[i][0]; i++) {
            if (!strcmp(dictionary[i][0], ent)) { 
                std::cout << "Word found: " << ent 
                          << " corresponds to: " << dictionary[i][1] 
                          << std::endl;
                return 0;
            }
        }

    std::cout << ent << " not found." << std::endl;
    return 1;
}

我想用类似的东西替换if (!strcmp(dictionary[i][0], word)) if (word == dictionary[i][0]) 并让它产生 Word found: Sixth corresponds to Saturday

如果我不能使用 == 运算符执行此操作,有没有办法通过使用指针但不依赖标头的函数来执行此操作?

谢谢!

【问题讨论】:

  • 因为 operator == 你比较指针本身的相等性
  • 如果你改用std::string,你可以使用==
  • 假设您正在尝试比较 char 数组,== 比较指针(第一个字符的地址),这不是 strcmp() 所做的。考虑使用std::string,而不是使用指针和数组,它确实有一个可以按预期工作的比较运算符。
  • 如果您想在== 按预期工作的地方使用 C++ 代码,那么您确实需要编写使用 C++ 类的 C++ 代码,例如 std::strings,而不是编写 C 代码使用普通的char 指针。

标签: c++ string equality implicit-conversion c-strings


【解决方案1】:

在if语句的条件下

if (word == dictionary[i][0])

比较字符串的第一个字符的地址。

在表达式中,有少数例外的数组(例如在 sizeof 运算符中使用它们)会隐式转换为指向其第一个元素的指针。

例如,如果您要编写这样的 if 语句

if ( "hello" == "hello" ) { /*...*/ }

然后表达式的计算结果为truefalse,具体取决于指定相等的字符串文字在内部存储为一个字符串还是单独的字符串的编译器选项。

您可以将字典定义为元素类型为std::string。在这种情况下,您可以使用相等运算符 ==。

在这种情况下,您可以将std::string 类型的对象与包含字符串的字符数组进行比较,因为字符数组将被隐式转换为std::string 类型的临时对象。

【讨论】:

  • 你们真的很快。谢谢!我就是这么怀疑的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多