无法访问If语句

时间:2014-04-03 18:45:42

标签: c++ if-statement

我已经编写了一个刽子手游戏的代码,它通常在Linux(我写的)上运行,但现在当我在OS X上编译它时(也使用g ++),它表现得非常奇怪。

我有一个名为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);  
    }   


}

1 个答案:

答案 0 :(得分: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

这应该使您的代码更容易处理。