2 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    엔터키를 두번 입력한 것도 아닌데 바로 출력문이 나오는 것은 무슨 이유때문인가요?

    GetAsyncKeyState() 는 호출되는 시점의 해당 키의 상태를 반환해 줍니다. 키보드를 누르고 띄는 과정 중 짧은 간격으로 GetAsyncKeyState() 이 여러번 호출된다면, 함수는 눌려졌다는 상태 여러번 반환 할 것입니다.

    즉, 키보드를 한번 입력했다고 생각을 해도 실제로 코드에서는 키보드의 눌려짐 상태를 가져오기 때문에 여러번 눌른것으로 처리될 수 있습니다.

    이런 문제를 해결하기 위해서는 '눌려졌다' 라는 상태를 읽는게 아니라 KEY_UP 이벤트 같은 눌려졌다 띄어진 순간을을 판단하는 것이 좋을 수 도 있습니다.

    간단한 방법으로는 _kbhit()_getch() 를 사용하는 사용하는 방법이 있습니다.

    #include <conio.h>
    
    int main() {
        for (;;) {
            if (!_kbhit())
                continue;
            int key = _getch();
    
            if (key == VK_RETURN) {
                // enter 에 대한 처리
            }
            else if (key == VK_ESCAPE) {
                // esc 에 대한 처리
            }
        }
        return 0;
    }
    

    _kbhit() 는 키보드가 눌린 시점을 판다합니다. 그 후 _getch() 를 통해 눌려진 키를 가져올 수 있습니다. 만약 _getch() 를 통해 해당 키를 가져오지 않으면, _kbhit() 는 계속 참을 반환하니 유의하시기 바랍니다.

    다음으로 두번째 문제는 서브메뉴1, 서브메뉴2에서 처음화면으로 돌아가기에서 엔터키를 눌렀을 때 메인메뉴로 가도록 하고싶은데 계속 서브메뉴1로 들어가지네요. 어느부분 때문에 그런것인지 궁금합니다.

    SubMenu.cpp 에 아래와 같은 코드를 볼 수 있습니다.

                case 2:
                {
                    MainMenu p("설문1", "설문2", "종료"); //위와 동일
                    p.Firstmenu();
                }break;
    

    이 처럼 새로운 MainMenu 를 생성하여 동작하면 아래와 같이 동작작하는 것이기 때문에 뒤로 돌아가는 것이 아닙니다. 이 경우 스택 오버플로우가 발생할 수 도 있구요.

    MainMenu -> SubMenu1 -> MainMenu -> SubMenu1 -> MainMenu -> ...
    

    해당 처리에서 while 문을 탈출하도록 코드를 작성하시던가 함수를 끝내도록 작성하시는 것이 좋을 것 같습니다. 이렇게 한다면 이전 MainMenu 의 루프로 되돌아가기 때문에 원하시는 동작을 하게 될 것입니다.

    • 제시해주신 방법대로 해결했습니다. 정말 감사합니다~! 홍승식 2017.11.28 17:07
  • 제 생각에 문제 1과 2는 동일한 현상 떄문에 발생하는것같습니다.

    문제1은 엔터를 눌러 서브메뉴로 들어가면 한국or미국, 영국or프랑스 를 선택하기도 전에 엔터가 한번 더 눌려서 출력이 되고

    문제2는 엔터를 눌러 처음으로 돌아가게되면 설문1or설문2 를 선택하기도 전에 엔터가 한번 더 눌려서 설문1이 선택되는것같습니다.

    입력받는 함수 전에 fflush()를 호출해보세요. 입력 스트림에 엔터가 남아있어서 그런 현상이 발생하는것같아요. (혹은 다른 입력스트림을 초기화하는 함수 사용)

    감사합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 조금 검색해봤습니다 이 블로그를 참조해보세요! http://plustag.tistory.com/1 알 수 없는 사용자 2017.11.27 15:51
    • 좋은 답변 감사드립니다~! 참조하신 블로그에 글을 읽고 개념을 잡는데 도움이 되었습니다! 입력 스트림에 엔터가 남아있어서 이러한 현상이 발생하는 것 같다고 하셨는데 의문점이 들어서 댓글로 다시 질문드립니다 ㅠㅠ 처음에 MainMenu()를 호출하면서부터 enter키를 입력받은 적이 없는 상태였다가, 메인메뉴에서 설문1로 들어가기 위해 엔터키를 입력하는 것이 처음으로 엔터키를 입력하는 것인데 입력스트림에 왜 엔터가 남아있어서 두번 입력되는 것인가요? 또 fflush(stdin); 문을 넣어서 입력스트림을 초기화해주라고 하셔서 SubMenu.cpp와 Mainmenu.cpp 에 GetAsyncKeyState를 포함하는 while 무한루프 문 바로 위에 삽입하였는데 동일한 현상이네요. 어디에 넣어서 입력스트림을 초기화해주어야할까요? 홍승식 2017.11.28 00:54

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)