2013-01-21 1 views
0

5 초 이내에 사용자가 입력 한 문자 수를 인쇄하려고합니다. 하지만 입력 버퍼를 가져 오는 중 일부 문제가 있습니다.stdin 및 입력 버퍼의 내부 작업

코드는 내가 항상 0 인 사용자와 출력 버퍼가 입력 한 입력을받지하고, 위의 코드에서

# include <signal.h> 
# include <sys/time.h> 
# define INTERVAL 3 
# define MAX_SIZE 1024 

char buffer[MAX_SIZE]; 
int count = 0; 

void alarm_handler (int i) 
{ 
    printf("\r\n"); 
    printf("\nTimer expired.....\r\n"); 
    count = read(stdin,buffer,sizeof(buffer)); 
    puts(buffer); 
    printf("count:%d\r\n",strlen(buffer)); 
    exit(0); 
} 

int main() 
{ 
    signal(SIGALRM,alarm_handler); 
    alarm(INTERVAL); 
    setbuf(stdin, NULL); 

    printf("Start Triggering....\r\n"); 
    while (1) 
    { 
     gets(buffer); 
    } 
    return; 
} 


스 니펫. 누구든지 무엇이 잘못되었는지 그리고 에 대한 해결책을 말해 주시겠습니까?

출력

 
++++++ 

Start Triggering.... 

akakakakakkaka 

Timer expired..... 

count:0 

는하지만이에 대한 귀하의 의견을 제시하시기 바랍니다 아래의 출력을

 
++++++++++++++++++++++++++++++ 

Start Triggering.... 

akakakakakkaka 

Timer expired..... 

akakakakakkaka 

count:14 

를 기대 해요.

+0

새로운 사용자! 코드 스 니펫을 작성하는 방법을 배우십시오 ... 4 줄 간격으로 모든 줄을 들여 쓰거나 백틱으로 둘러 쌈으로써'인라인 코드'를 삽입하십시오. 더 쉽게 읽을 수있게 해줍니다. 예를 들어'# include' 문은'# '기호가 해석되는 방식 때문에 ** bold **로 표시됩니다 ... – Floris

+0

한 번 더 ... 5 초 동안 "INTERVAL"을 계산하려고합니다. 3. 나는 아래의 코드에서 그 가치를 지켰다. 그러나 그것은 당신이 요구 한 것이 아니다. – Floris

답변

0

버퍼링과 같은 것들이 상당히 복잡합니다. 나는 당신의 문제에 약간 다른 접근법을 취했다 - 키 스트로크가 즉시 (<enter>이 눌러 질 때까지 기다리는 대신에) 프로그램에 전달되도록 키를 눌렀을 때 키를 누른 횟수를 세는 터미널 설정. 터미널 설정을 수정하는 getch() 함수를 사용해야합니다. 인터럽트가 "잘못된 시간에"발생했을 경우를 대비하여 끝에 "이전"설정으로 터미널이 반환되는지 확인합니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <sys/time.h> 
#include <unistd.h> 
#include <termios.h> 
#define INTERVAL 3 

int count = 0; 
int flag = 0; 
struct termios oldt; // keep old terminal settings to restore at the end 

// function prototype - compiler was complaining. Not sure why? 
unsigned int alarm(unsigned int interval); 

void alarm_handler(int i) { 
    flag = 1; 
} 

int getch(void) 
{ 
    // function to return keystroke "as it happens" 
    int ch; 
    struct termios newt; 
    tcgetattr(STDIN_FILENO, &oldt); /*store old settings */ 
    newt = oldt; /* copy old settings to new settings */ 
    newt.c_lflag &= ~(ICANON | ECHO); /* make one change to old settings in new settings */ 
    tcsetattr(STDIN_FILENO, TCSANOW, &newt); /*apply the new settings immediatly */ 
    ch = getchar(); /* standard getchar call */ 
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt); /*reapply the old settings */ 
    return ch; /*return received char */ 
} 

int main() { 
    signal(SIGALRM,alarm_handler); 
    alarm(INTERVAL); 

    printf("Start Triggering....\r\n"); 
    char c; 
    do 
    { 
     c = getch(); // get key as soon as it's pressed 
     putchar(c); // and echo to the screen 
     count++;  // increment counter 
    } while (!flag); 

    printf("\nTimed out!\nCharacter count = %d\n", count); 
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt); /*reapply the old settings */ 

    return 0; 
} 
+0

면책 조항 : 나는 getch() 자신의이 버전을 생각해 내지 못했습니다 ... 나는 여기에서 그것을 발견했습니다 : http://www.cplusplus.com/forum/unices/18395/하지만 그게 원래 것이 아니라고 확신합니다. 소스도. 원저자가 자신을 고맙다고 여기기를 바랍니다. – Floris