컴퓨터 엑셀 워드 포토숍 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Previous Post 리눅스] 페도라(Fedora)를 VMware에 설치할 때, 운영체제(OS) 선택은?Ubuntu] 우분투 리눅스 비프음 제거하는 법 - Beep(삑삑하는 소리) 없애기C언어] 정규분포, 가우스(Gaussian) 랜덤(난수) 발생 - Gaussian Rand...우분투(Ubuntu)리눅스] root 계정으로 로그인하기, 루트(root) 계정 만들기리눅스] 시스템 종료/리부팅(다시 시작)/로그아웃 명령 - Linux Shutdown Lo...문제해결] LCD 모니터 글자가 희미하고, 가독성이 낮음 - LCD Monitor Scre...C언어] 문자열 치환 함수, 문자열 모두 바꾸기 - String Replace AllJava/자바] 문자열 치환, 문자 바꾸기, 모두 바꾸기; String Replace Al...[QnA] 영어 어원 사전 있는 곳은? - 영단어 어원 English Etymology D...자바/Java: jar 에러] Failed to load Main-Class manifes...

C언어] (Yes-No) (Y-N) (+Cancel) 선택 묻기 사용자 입력받기 - 예/아니오

Wednesday, October 04, 2006

콘솔 프로그램(GUI가 아닌 텍스트 모드 프로그램)에서, 사용자에게, 예/아니오(Y/N)를 묻는 함수입니다. Y/N 이외의 키를 누르면, Y/N 키 중의 하나를 입력할 때까지 다시 묻습니다.

C언어는 물론이고 어떤 언어에서도 이런 세세한 함수까지 제공하지 않기에, 프로그래머가 직접 만들어서 사용해야 하는데, 의외로 경우의 수가 많아서 좀 까다로운 편입니다.

여기서 소개하는,
int getYesNoKey(void);
는 Y/N 키 둘 중의 하나를 대소문자 구분없이 입력받아서 판단하는 것이고,

int getYesNoCancelKey(void);
이것은 "예/아니오/취소" 3가지 경우의 선택을 받아서 판단합니다.
대소문자 구분없이 Y/N/C 키를 받되, Esc키 즉 취소키도 C와 동등하게 취급했습니다.

참고로 아래의 소스는 비주얼C++에서 테스트되었습니다.


키보드로, Y/N 과 Y/N/C 입력 받기 예제


파일명: 0.cpp
#include <stdio.h>
#include <conio.h>

int getYesNoKey(void);
int getYesNoCancelKey(void);


void main(void) {
  int test;

  printf("Yes/No Test: 할까요? 말까요? (Y/N)? ");
  if (getYesNoKey()) {
    puts("Y 를 누르셨군요.");
  }
  else {
    puts("N 을 누르셨군요.");
  }



  printf("Yes/No/Cancel Test: 할까요? 말까요? 또는 아예 취소할까요 (Y/N/C)? ");
  test = getYesNoCancelKey();

  if (test == 1) {
    puts("Y 를 누르셨군요.");
  }
  else if (test == 0) {
    puts("N 을 누르셨군요.");
  }
  else if (test == 2) {
    puts("C 또는 Esc 키를 눌러 취소하셨군요.");
  }

}




int getYesNoKey(void) {
  int key;

  while((key = getch()) != NULL) {
    if (key == 'y' || key == 'Y') {
      puts("Y");
      return 1; // 참을 반환
    }
    else if (key == 'n' || key == 'N') {
      puts("N");
      return 0; // 거짓을 반환
    }
  }
  return -1; // 이 줄이 없으면, warning C4715: 'getYesNoKey' : not all control paths return a value
}




int getYesNoCancelKey(void) {
  int key;

  while((key = getch()) != NULL) {
    if (key == 'y' || key == 'Y') {
      puts("Y");
      return 1; // 참을 반환
    }
    else if (key == 'n' || key == 'N') {
      puts("N");
      return 0; // 거짓을 반환
    }
    else if (key == 'c' || key == 'C' || key == 0x1B) {
      puts("C");
      return 2; // 참을 반환 (다만 값이 다름)
    }
  }
  return -1; // 이 줄이 없으면, warning C4715: 'getYesNoKey' : not all control paths return a value
}



실행 결과:
D:\Z>cl 0.cpp && 0.exe
0.cpp
Yes/No Test: 할까요? 말까요? (Y/N)? Y
Y 를 누르셨군요.
Yes/No/Cancel Test: 할까요? 말까요? 또는 아예 취소할까요 (Y/N/C)? C
C 또는 Esc 키를 눌러 취소하셨군요.
D:\Z>


소스 주석문에서 warning C4715: 'getYesNoKey' : not all control paths return a value 이런 경고는, "반환값이 있는 함수는 항상 반환값이 있어야 하는데, 특수한 조건에서만 반환값이 있다는" 경고입니다. 이런 경고가 나오지 않게끔 return -1; 이런 불필요한 줄을 넣었습니다.

사용자가 YN 이 아닌 엉뚱한 키를 누를 경우를 대비해서 무한 루프를 돌려야 하는데, 그냥 while(1) 이렇게 무한 루프를 만들면 warning C4127: conditional expression is constant (조건문이 상수로 되어 있다) 라는 워닝이 나오기에, while((key = getch()) != NULL) 이렇게 해주었습니다.



getch() 는 표준입력으로부터 간접적으로 입력받는 것이 아니라 키보드로부터 직접 입력을 받습니다. 그래서 입력받은 키를 화면에 출력(에코)하지 않습니다. getch()를 사용하지 않으면, 사용자가 엉뚱한 키를 눌렀을 때에도 그 키가 화면에 출력되기에 좀 지저분해집니다. 그래서 getch()를 사용했습니다. getch() 함수는 conio.h 에 정의되어 있습니다.


참고로, Esc키의 아스키 코드 값이 0x1B 입니다.


☞ C/C++

0 Comments:

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Categories
Previous Posts
Monthly Archives
Top