2013-03-09 2 views
3

다음과 같이 C 언어로 프로그램을 작성해야합니다 : 예를 들어, "a"를 누르면 단말기는 끝나지 않은 루프에서 입력 된 문자를 쓰게됩니다 aaaaaaaaaaaaaaaa ... 다른 키, 예를 들어 "b"가 누를 때까지. 최종 출력은 다음과 같아야합니다 : aaaaaaaaabbbbbbq (q는 프로그램을 종료해야합니다). 여기 내 코드 :리눅스에서 keypress를 사용하는 브레이크 루프

int main(int argc, char** argv) { 

    int c; 
    static struct termios staryTermios, novyTermios; 


    tcgetattr(STDIN_FILENO, &staryTermios); 

    novyTermios = staryTermios; 
    novyTermios.c_lflag &= ~(ICANON); 
    tcsetattr(STDIN_FILENO, TCSANOW, &novyTermios); 
    while ((c = getchar()) != 'q') { 
     putchar(c); 
    } 

    tcsetattr(STDIN_FILENO, TCSANOW, &staryTermios); 

    return 0; 
} 

이 버전은 한 번에 입력 된 문자를 작성 후 난 당신이 모두 공통 변수를 액세스하는 것 두 개의 스레드가 필요합니다 추측 다른 키를 누를 때

답변

0

을 기다립니다. 한 스레드의 작업은 공통 변수를 연속적으로 인쇄하는 것입니다. 두 번째 작업은 키보드에서 입력을 기다리고 그에 따라 변수를 업데이트하는 것입니다.

+0

고마워,하지만 난 C 프로그래밍의 새로운 오전 및 스레드를 사용하는 방법을 모르겠다. 친구가 나를 대신 read() 함수를 사용하도록 제안 od getchar(). 하지만 난() 함수 또는 그와 같은 뭔가를 readout() 시간 초과하는 방법을 모르겠다 – user2151486

1

원하는 결과를 얻으려면 표준 입력을 비 차단으로 설정해야합니다. 이렇게 코드를 약간 수정하면됩니다. Mac OS X 10.7.5에서는 정상적으로 작동합니다. getchar()은 문자를 읽을 준비가되어 있지 않을 때 EOF를 반환합니다 (대부분의 시간이 될 것입니다. 여러분이나 내가 현대 컴퓨터에 문제없이 입력 할 수는 없습니다). 약간의 시스템에서 읽으려는 문자가 없을 때 getchar()이 EOF를 한 번 반환했다면 EOF가 아닌 다른 것을 반환 할 수는 없지만 Mac OS X에서는 문제가되지 않았다고 염려합니다.

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

static void err_exit(const char *msg); 

int main(void) 
{ 
    int c; 
    int oc = '\0'; 
    struct termios staryTermios, novyTermios; 
    int oflags, nflags; 

    if (tcgetattr(STDIN_FILENO, &staryTermios) != 0) 
     err_exit("tcgetattr() failed"); 

    novyTermios = staryTermios; 
    novyTermios.c_lflag &= ~(ICANON); 
    if (tcsetattr(STDIN_FILENO, TCSANOW, &novyTermios) != 0) 
     err_exit("tcsetattr() failed to set standard input"); 

    oflags = fcntl(STDIN_FILENO, F_GETFL); 
    if (oflags < 0) 
     err_exit("fcntl() F_GETFL failed"); 

    nflags = oflags; 
    nflags |= O_NONBLOCK; 
    if (fcntl(STDIN_FILENO, F_SETFL, nflags) == -1) 
     err_exit("fcntl() F_SETFL failed"); 

    while ((c = getchar()) != 'q') 
    { 
     if (c != EOF) 
      oc = c; 
     if (oc != '\0') 
      putchar(oc); 
    } 

    if (tcsetattr(STDIN_FILENO, TCSANOW, &staryTermios) != 0) 
     err_exit("tcsetattr() failed to reset standard input"); 

    putchar('\n'); 
    return 0; 
} 

static void err_exit(const char *msg) 
{ 
    fprintf(stderr, "%s\n", msg); 
    exit(1); 
} 
+0

고마워,이 나를 위해 일한 :) 문제 해결 – user2151486

관련 문제