c++ 콘솔 구성 오류 (초보)


  • 2017년 11월 27일에 작성됨

조회수 146


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일에 작성됨

  • 제시해주신 방법대로 해결했습니다. 정말 감사합니다~!    홍승식   2017.11.28 17:07     

제 생각에 문제 1과 2는 동일한 현상 떄문에 발생하는것같습니다.

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

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

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

감사합니다.

  • 2017년 11월 27일에 작성됨
    안드로이드 입문

  • 조금 검색해봤습니다 이 블로그를 참조해보세요! 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     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close