2014-04-03 116 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中只抓取一个字符的方法。 –