将char *与字符串文字进行比较的问题

时间:2014-02-20 23:20:49

标签: c++ char

我正在研究Go Fish的课程项目。在这段代码中,我试图从播放器中获取卡片的面值并将其转换为它的int数值(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说它读取我正在比较的字符串文字时出错。

4 个答案:

答案 0 :(得分:3)

temp是一个指针,例如,"J"是一个2 char的数组,可以将其转换为指向其第一个元素的指针。所以你要比较两个指针。比较temp == "J"表示“这两个C风格的字符串中的第一个字符是否具有相同的地址?”答案是否定的,他们没有。

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

答案 1 :(得分:3)

替换:

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

使用:

std::string temp(valued);

它会更好地工作 - 现在你正在比较字符串指针,而std::string实际上在运算符==上有一个重载,用于在尝试时与C风格的字符串进行比较。

答案 2 :(得分:1)

您不能在任何地方使用代码示例中的字符串(std::string)! c ++中"something"的正确术语是'character array literal'。你的意思是:

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

否则你只是比较char指针(const char*),这些指针不太可能符合你的意思。

答案 3 :(得分:0)

==默认情况下比较字符串的地址,而不是内容。你需要使用像strcmp

这样的东西