0

ユーザーが入力した文字数を 5 秒以内に出力しようとしています。しかし、入力バッファのフェッチで問題に直面しています。

コードスニペット


# 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;
}

上記のコードでは、ユーザーが入力した入力を取得しておらず、出力バッファーは常にゼロです。何がうまくいかなかったのか、その解決策を教えてください。

出力

++++++

トリガーを開始....

アカカカカカカ

タイマー切れ……

カウント:0

しかし、私は以下の出力を期待しています

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

トリガーを開始....

アカカカカカカ

タイマー切れ……

アカカカカカカ

カウント:14

これについてあなたの見解を提案してください。

4

1 に答える 1

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;
}
于 2013-01-21T13:59:01.363 に答える