2014-04-03 155 views
0

我已經編寫了一個在Linux上正常工作的hangman遊戲代碼,但現在當我在OS X上編譯它(也使用g ++)時,它的行爲非常奇怪。無法訪問If語句

我有這樣的功能稱爲getCharacter()基本上從用戶請求的一個字符,然後(因爲我個人發現它更容易)我保存的字符作爲一種類型string代替char。但是,當我需要比較所選字母是否存在於單詞中時,我需要從所選單詞中提取每個字符,然後將其與用戶輸入的字符串字符進行比較。所以我做了這個非常尷尬的char轉換,我從字符串.at(i)函數獲得了一個臨時字符串,然後我將它與所選字母進行比較。如果匹配,則將該字母放入i位置的矢量中。 它在Linux上運行得很好,但在這裏奇怪地說,當用戶鍵入一個字母,即使它在所選字詞中時,除非它是第一個字母,否則if()語句會被忽略。

因此,這裏是我的功能,我還在學習,所以請原諒我缺乏專業性:

void Game::getCharacter(){ 

    string character; 

    cin >> character; 

    while((character.length() > 1) || (checkIfUsed(character))){ 
     cout << "Not a character or already used, try again:\n"; 
     cin >> character; 
     cout << endl; 
    } 

    if(RETRIES_LEFT>0){ 
     for(int i = 0; i < DIFFICULTY; i++){ 
      char TEMP_CHAR = CHOESENWORD.at(i); 
      char *TEMP_CHAR_PTR = &TEMP_CHAR; 
      string TEMP_STRING_LETTER(TEMP_CHAR_PTR); 

      if(TEMP_STRING_LETTER == character){ 

       FRAME.at(i) = character; 
       GUESSED+=1;  
      } 
     } 

     RETRIES_LEFT-= 1;   
     NUM_LETTERS_USED+=1;    
     LETTERS_USED.push_back(character); 
    } 


} 
+0

RETRIES_LEFT被初始化了嗎?你有沒有在那裏放置一個斷點來檢查它的價值?它大於'0'嗎? – CoryKramer

+0

'checkIfUsed'是否以任何方式更改'RETRIES_LEFT'? – streppel

+0

是的,它大於0.如果它是0,那麼我跳到最後。 – gEdringer

回答

3

獲取直接的問題:

char TEMP_CHAR = CHOESENWORD.at(i);   // grab copy of a char at [i] 
char *TEMP_CHAR_PTR = &TEMP_CHAR;   // take the address of the char 
string TEMP_STRING_LETTER(TEMP_CHAR_PTR); // call string(const char* str) 
     // constructor, which is incorrect because strlen(&TEMP_CHAR) will 
     // give a pretty random result. this is due to how data is laid out 
     // in memory. To sum this up, you're having a buffer overrun issue, 
     // where the buffer is TEMP_CHAR (1 byte) 

這可能是你想要什麼實現:

if (CHOSENWORD[i] == character[0]) { 

在任何一種情況下,代碼中都有很多需要改進的地方,因爲它很明顯在你剛開始使用C/C++時。放心吧,其實並不複雜。

如何做到這一點更容易?那麼,首先,你可以先詢問一個字符:

char ch; 
std::cin >> ch;  // get a single char 
std::cin.sync(); // flush all extra input 

這應該讓你的代碼更容易處理。

+0

非常感謝! – gEdringer

+0

@Jorma這是一個很好的接觸。我沒有關注if語句的內部。 – streppel

+0

我很高興解決了這個問題。我還編輯了我的答案,以包含從std :: cin中只抓取一個字符的方法。 –