4

Turbo C++ 4.5 エディターで、ユーザー入力を 5 秒待つだけの簡単な C プログラムを作成したいと考えています。例として、

#include <stdio.h>

void main()
{
  int value = 0;
  printf("Enter a non-zero number: ");

  // wait only 5 seconds for user input
  scanf("%d",&value);
  if(value != 0) {
    printf("User input a number");
  } else {
    printf("User dont give input");
  }
}

したがって、「scanf」機能を 5 秒間待機し、それ以外の場合は if-else 部分を実行するコードになります。

4

3 に答える 3

9

select(2) ループを試してください: https://www.mirbsd.org/man2/selectを stdin (fd#0) で 5 秒のタイムアウトで。データがあることを示す select が返された場合にのみ、scanf(3) を実行します。(例については、mksh ソース コードの c_read() 関数を参照してください。)

poll(2) のような他の関数も可能です。ノンブロッキング I/O は少し過剰です。

OK、これは select を使った (MirBSD での) 動作例です:

#include <sys/types.h>
#include <sys/time.h>
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int
main(void)
{
    int value = 0;
    struct timeval tmo;
    fd_set readfds;

    printf("Enter a non-zero number: ");
    fflush(stdout);

    /* wait only 5 seconds for user input */
    FD_ZERO(&readfds);
    FD_SET(0, &readfds);
    tmo.tv_sec = 5;
    tmo.tv_usec = 0;

    switch (select(1, &readfds, NULL, NULL, &tmo)) {
    case -1:
        err(1, "select");
        break;
    case 0:
        printf("User dont give input");
        return (1);
    }

    scanf("%d", &value);
    if (value != 0) {
        printf("User input a number");
    } else {
        printf("User dont give input");
    }
    return (0);
}

終了コードを少しいじって、コード全体にいくつかの \n を散りばめたいと思うかもしれません。最初fflush(stdout);にプロンプ​​トが表示されるようにするために重要です…</p>

于 2013-10-04T16:14:50.220 に答える
2
#include <stdio.h>
#include <signal.h>

void handler(int signo)
{
  return;
}

int main()
{
  int x;
  struct sigaction sa;

  sa.sa_handler = handler;
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = 0;
  sigaction(SIGALRM, &sa, NULL);

  alarm(5);

  if (scanf("%d", &x) == 1)
  {
    printf("%d\n", x);
    alarm(0); // cancel the alarm
  }
  else
  {
    printf("timedout\n");
  }
  return 0;
}
于 2013-10-04T16:40:38.950 に答える