2012-02-29 2 views
-1

while 키를 누를 때 스페이스 키를 눌러야합니다. 예를 들어C에서 키 입력으로 while 루프를 종료하는 방법은 무엇입니까?

:

while (some condition) 

{ 

printf ("Press space bar to continue..."); 

} 

감사합니다!

+4

을 (리턴 키와 같은없이) 단일 키 스트로크를 읽는 플랫폼 특정 코드가 필요합니다,하지만 당신은 말하지 않았다 어떤 플랫폼을 사용하고 있는지 알려주세요. 또한 읽기를 막을 지 여부도 명확하지 않습니다. 사용자가 키를 누를 때까지 기다리시겠습니까? 아니면 코드를 실행하고 키 스트로크를 지금 확인한 다음 해당 루프를 종료하십시오. 사용자가 키를 누르면? –

+0

죄송합니다, 자사의 리눅스. 실제로 키를 입력해도 괜찮습니다. – eastboundr

+0

콘솔 또는 창 (GUI) 응용 프로그램을 빌드하고 있습니까? – Vyktor

답변

3

에 조건에서, x를 설정하는 것이 넣어 위의 귀하의 의견을 주셨습니다.

char input = 0; 
while(input != ' ') 
{ 
    printf("Press space bar to continue...\n"); 
    scanf("%c",&input); 
} 

또는 원하는 경우, Enter 키를 타격하지 않고는 :

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    char input = 0; 
    while(input != ' ') 
    { 
    printf("Press space bar to continue...\n"); 
    input = getch(); 
    } 
} 

이 내 msysgit의 bash 쉘에서 일했다. 그러나 일부 사람들은 리눅스에서도 작동한다고 주장 할 것입니다. 내가 리눅스를 좋아한다고 생각 하겠지만, 위의 해결책은 msysgit에서 이루어졌다. 다음은 저의, Ubuntu 10.10을위한 Oracle VM입니다.

#include <stdio.h> 
#include <termios.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    char input = 0; 
    while(input != ' ') 
    { 
    printf("Press space bar to continue...\n"); 
    input = mygetch(); 
    } 
} 

int mygetch(void) 
{ 
    struct termios oldt, newt; 
    int ch; 
    tcgetattr(STDIN_FILENO, &oldt); 
    newt = oldt; 
    newt.c_lflag &= ~(ICANON | ECHO); 
    tcsetattr(STDIN_FILENO, TCSANOW, &newt); 
    ch = getchar(); 
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt); 
    return ch; 
} 

mygetch

here에서왔다.

+0

작동하지 않습니다 ... 스페이스 바를 입력하고 Enter 키를 눌러야합니다. –

+0

도움을 주셔서 감사합니다. 그러나 코드가 컴파일되지 않습니다. – eastboundr

+0

은 "% c"가되어야합니다. – eastboundr

-2

하는 변수 x = 1을 확인 그들이 스페이스 바를 누를 때 난 당신이 한 Enter 키 다음에 스페이스 바를 수용으로 다음과 같은 의미라고 생각 2.

+0

하지만 어떻게 키 입력을 잡을 수 있습니까? 감사합니다 – eastboundr

+1

@eastboundr 당신이 물어 본 것과 완전히 다른 질문입니다.이 답변의 코멘트는 당신이 질문해야하는 곳이 아닙니다. – meagar

+0

-1, 응? 이것은 효과적이고 합리적인 대답입니다. – macduff

1

대부분의 플랫폼에서 키 스트로크를 캡처하려면 콘솔에 직접 액세스해야합니다. 일반적으로 도움이되는 라이브러리가 있습니다. 저수준 라이브러리는 termcap (터미널 기능에서 파생) 라이브러리입니다. curses라는 termcap 위에 "휴대용"레이어가 있습니다. 리눅스는 ncurses라고 불리는 GNU 버전을 사용하고 실제로 많은 플랫폼에서 사용 가능합니다.

저주 광범위하게 당신이

$ man ncurses 

문제를 사용하여 자습서를 시작할 수 있습니다 문서화 단계 콘솔을 초기화하고 키 입력 독자를 설정을 필요로한다. 원하는 효과를 얻는 데는 여러 가지 방법이 있습니다.

나는 놀 수있는 실례를 게시하고 있습니다.

/* file: curses_ex1.c */ 

#include <stdio.h> 
#include <curses.h> 

const char rotary[4] = "/-\\|"; 
int main() { 
    WINDOW *w; 
    int i = 0; 
    w = initscr(); 
    if (w == NULL) { 
     return -1; /* unable to initialize curses */ 
    } 
    timeout(500); /* do not block */ 
    mvprintw(0, 0, "Press space bar to break out of the loop."); 
    noecho(); 
    for(i = 0; ; i++) { /* no condition so loops forever */ 
     int c; 
     mvaddch(0, 42, rotary[i%4]); /* display rotator */ 
     c = getch(); /* get a character */ 
     if (c == ' ') 
      break; 
     if (c != ERR) { /* not a space but another valid key */ 
      mvprintw(1, 0, "You need to press a space for me to stop (you pressed `%c')", c); 
     } 
    } 
    endwin(); 
    return 0; 
} 

그것을 컴파일하려면 : 그것은 저주에 몇 가지 기본적인 아이디어를 보여줍니다

cc -o curses_ex1 curses_ex1.c -lcurses 
관련 문제