将 char * 与字符串文本进行比较时出现问题

Problems comparing char * to a string literal

本文关键字:比较 问题 char 字符串 文本      更新时间:2023-10-16

我正在为一个类项目开发Go Fish。在此代码中,我尝试从播放器中获取卡片的面值并将其转换为其整数值(2 - 10,J=10,Q = 11...)

    char valued[10];
    cin.clear();
    cin.ignore(INT_MAX, 'n');
    cout << "What card would you like to ask " << _otherplayers[IndexOfPlayerChoice]->GetName() << " for? (2-10, J, Q, K, A) ";
    cin >> valued;
    int size = strlen(valued) +1;
    char * temp = new char[size];
    strcpy_s(temp, size, valued);
    if (temp == "J" || temp == "j")
        value = 11;
    if (temp == "Q" || temp == "q")
        value = 12;
    if (temp == "K" || temp == "k")
        value = 13;
    if (temp == "A" || temp == "a")
        value = 14;
    if (temp == "2" || temp == "3" || temp == "4" || temp == "5" || temp == "6" || temp == "7" || temp == "8" || temp == "9" || temp == "10")
        value = int(temp);

但是,当我运行代码时,它永远不会落入任何 if 语句。在调试器中,它将显示 temp = "A",但当它到达 if 语句时,它将计算为 false。

知道为什么会发生这种情况吗?

编辑:尝试像这样使用 strcmp

    if (strcmp(temp, "J") == 0 || strcmp(temp, "j") == 0)
        value = 11;
    if (strcmp(temp, "Q") == 0 || strcmp(temp, "q") == 0)
        value = 12;
    if (strcmp(temp, "K") == 0 || strcmp(temp, "k") == 0)
        value = 13;
    if (strcmp(temp, "A") == 0 || strcmp(temp, "a") == 0)
        value = 14;
    else
        value = int(*temp);

但是strcmp说它在读取我正在比较的字符串文字时出错。

temp是一个

指针,例如,"J"是一个 2 个char的数组,可以转换为指向其第一个元素的指针。所以你正在比较两个指针。temp == "J"的比较意味着,"这两个 C 样式字符串中的第一个字符是否具有相同的地址?答案是否定的,他们没有。

要比较 C 样式字符串,应使用 strcmp 。但是,C++中更合适的方法是使用 std::string 而不是 C 样式的字符串。

替换:

char * temp = new char[size];
strcpy_s(temp, size, valued);

跟:

std::string temp(valued);

而且它会更好地工作 - 现在您正在比较字符串指针,而std::string实际上在运算符==上过载,以便在您尝试时与 C 样式字符串进行比较。

您没有在任何地方的代码示例中使用字符串(std::string)!在 c++ 中,"something"的正确术语是"字符数组文字"。你的意思是:

if (strcmp(temp,"J") == 0 // ...

否则,您只是在比较字符指针(const char*),whch不太可能与您的意思相匹配。

默认情况下,

== 比较字符串的地址,而不是内容。你需要使用类似strcmp的东西