我已经编写了一个刽子手游戏的代码,它通常在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);
}
}
答案 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
这应该使您的代码更容易处理。