2013-10-18 4 views
0

저는 Hangman을 C++로 제작해야하는 프로젝트를 진행하고 있습니다. 나는 그것의 대부분을 작동 시키지만, 사용자가 추측을 한 후에 매번 정확하게 추측 된 단어의 부분을 인쇄하는 일에 매달 렸습니다. 교수형 집행 인의 게임을 대표하는 수업을 만들었습니다.이 수업에서는 추측을 위해 무엇을해야하는지 결정하는 방법이 있습니다. 사전에서 임의로 선택된 단어의 임의 위치에서 추측이 발견되면 해당 문자를 currentWord라는 벡터의 같은 위치에 저장합니다. currentWord는 무작위로 선택된 단어의 길이에 대해 "_"을 포함하도록 컨스트럭터에서 초기화됩니다 (단어와 크기가 같아서 사용자가 추측을 입력 할 때 업데이트 할 수 있음). 예를 들어 단어가 "세미콜론"이고 사용자의 첫 번째 추측이 'i'인 경우 currentWord 벡터의 '_'을 'i'문자로 바꿉니다.벡터 범위를 벗어났습니다 - C++

string tempWord = word; 
    for (int i = 0; i < tempWord.size(); i++) { 


     u_long location = tempWord.find(guess); 
     currentWord->at(location) = tempWord[location]; 
     tempWord[location] = '_'; 
    } 

내가하려고 시도한 것은 tempWord라는 임시 변수에 "word"라는 멤버 변수를 저장하는 것입니다. 그런 다음 0에서부터 임시 단어 길이까지 반복합니다. tempWord.find (추측)를 사용하여 추측과 일치하는 tempWord의 위치를 ​​찾고 location이라는 변수에 저장 한 다음 해당 위치의 tempWord와 같도록 해당 위치의 currentWord 벡터를 업데이트합니다. 이것은 처음으로 일치하는 char가 발견되었을 때만 작동하므로, 다음번에 tempWord [location]을 '_'으로 변경하면 위치가 달라집니다. 하지만 이렇게하면 어떤 때는 범위를 벗어난 오류가 발생합니다. 내가 의견을 말하면

tempWord[location] = '_'; 

이 표시되지 않지만 첫 번째 발생 만 대체됩니다. 이 오류를 벗어난 경우에도 디버거에서 각 발생이 currentWord 벡터에서 올바르게 대체되었음을 알 수 있습니다. 이것은 나를 매우 혼란스럽게 만들며, 그래서 어떤 도움이라도 대단히 감사하게 될 것입니다! 위치는 성병 : : 문자열 : 비영리 단체를 동일한 경우 rapptz 제안에 감사

편집

덕분에 나는 마침내 작업 한 확인합니다.

string tempWord = word; 
    for (int i = 0; i < tempWord.size(); i++) { 


     u_long location = tempWord.find(guess); 
     if (location != std::string::npos) { 
      currentWord->at(location) = tempWord[location]; 
      tempWord[location] = '_'; 
     } 

    } 

난 정말 너무 트리스탄의 제안을 좋아하고, 가장 가능성이 내일 할 것입니다 : 여기에 장소 체크인과 업데이트 된 코드 세그먼트입니다. 내가 한 번, 다른 사람이 유용하다고 생각할 수도 있기 때문에 업데이트 된 코드를 게시 할 것입니다. 다시 한 번 감사드립니다!

+4

당신은 위치 표준 : : 문자열 :: npos''와 같은 경우는 확인해야합니다. – Rapptz

+0

팁 주셔서 감사! 그랬어. 진짜 대답이라면 빨리 받아 들일 것입니다. 다시 한 번 감사드립니다 – mike

+1

또한 'tempWord [location] ='_''을 설정하여 다음 일치 항목을 찾지 말고 시작 위치를 취하는'std :: string :: find()'오버로드 중 하나를 사용해야합니다 , 이전 경기의 위치를 ​​전달합니다. 그렇게하면'tempWord'에 쓸 필요가 없기 때문에 (복사를하지 않아도 됨) 검색 속도가 빨라집니다. –

답변

0

의견을 달아 주려고했지만 더 큰 텍스트 상자에서 더 쉽습니다. 이 같은 tempWord 사본 및 for 루프를 모두 방지 할 수 있습니다

std::string::size_type location = 0, start_pos = 0; // int would be fine, tbh 

while ((location = word.find(guess, start_pos)) != std::string::npos) { 
    currentWord.at(location) = word[location]; 
    start_pos = location; 
} 
0

내 생각에 tempword.find (추측)는 1에서 단어 길이가 아니라 0으로 시작합니다. 그 기능도 공유하십시오.

+2

내 생각에'std :: string :: find()'가 실행됩니다. –

관련 문제