2014-04-03 2 views
0

리눅스에서 정상적으로 작동하는 행맨 게임 코드를 작성했지만 현재 OS X (g ++ 사용)에서 컴파일 할 때 매우 이상하게 작동합니다.If 문에 액세스 할 수 없습니다.

나는 내가 형 대신 charstring으로 문자를 저장 (나는 개인적으로 쉽게 찾을 수 있기 때문에) 기본적으로 다음, 사용자로부터 하나의 문자를 요청 getCharacter()이라는 기능을 가지고있다. 그러나 내가 선택한 문자가 단어에 존재하는지 비교해야 할 때 선택한 단어에서 각 문자를 추출한 다음 사용자가 입력 한 문자열 문자와 비교해야합니다. 그래서 저는 을 매우 어색하게 변환했습니다.이 문자는 .at(i) 문자열의 함수에서 다음에 선택한 문자와 비교되는 임시 문자열에 이릅니다. 일치하면 문자를 i 위치의 벡터에 넣습니다. 리눅스에서 아주 효과가 있었지만, 이상하게도 사용자가 선택한 단어에 글자를 입력해도 첫 글자가 아닌 한 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에서 단 한 문자 만 가져올 수있는 방법을 포함하도록 답변을 편집했습니다. –