2014-02-20 109 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

是的,這是最快的修復而不需要重寫*全部*的代碼。 –