2014-02-20 87 views
0

我正在使用Go Fish作为类项目。在这段代码中,我试图采取从球员卡的面值,并把它转换成它的INT数值(2 - 10,J = 10,Q = 11 ...)将char *与字符串文字进行比较的问题

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说,他有一个错误读取字符串文字,我比较。

+1

你在这里没有使用'std :: string' n你的代码,只是'char *'?!?你还有什么问题吗? –

+0

@πάνταῥεῖ他将char *与字符串文字 –

+0

进行比较时遇到问题,您无法将字符串与此'== ==运算符 – mangusta

回答

3

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

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

+0

问题是我们不能在这个类中使用字符串,因为它们还没有被覆盖。无论如何,我可以修补它,让它在没有弦的情况下工作? – user3334986

+0

为了澄清,'std :: string'实现了比较(==)运算符,并且它按预期工作(值相等)。另外,@ user3334986他告诉你如何:p – keyser

+0

@ user3334986您可以使用'strcmp'而不是'=='。 –

0

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

+0

_'字符串的地址'_什么字符串? –

+0

对不起,字符串我的意思是char * – akirilov

1

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

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

否则你只是在比较字符指针(const char*),界河不太符合你的意思。

3

替换:

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

有了:

std::string temp(valued); 

而且它会工作好了很多 - 现在你比较字符串的指针,而std::string实际上有运营商==过载与您尝试的C风格字符串进行比较。

+0

或者更好的是,首先声明'valued'为'std :: string'并摆脱'temp' – wjl

+0

是的,这是最快的修复而不需要重写*全部*的代码。 –