1

ユーザーが特定の時間内に数字を推測するプログラムを書きたいと思います。時間内に当てられなかった場合はタイムアウトとなり、最初からやり直しとなります。

お気に入り

main() {
    int i, timer;
    while(1) {
        /* How to run the timer independently and it will signal that time out !!!*/
        for(i = 0; i <= 10; i++) {
            printf("\n Guess the value of i : ");
            scanf("%d", &j);
            if(i != j) {
                printf("Bad Luck wrong Guess ");
            }
            else
                printf("Great, You guessed correctly \n");
        }
    }
}

このプログラムでは、タイマーを実行する場所と方法がわかりません。私を助けてください。

4

3 に答える 3

1

あなたの根本的な問題は、ユーザーが Enter を押すまで scanf() が返されないことです。そのため、タイマーが切れても、ユーザーが Enter キーを押すまでは何も起こりません。

標準の ANSI C では、これに対する実際の解決策はありません。プラットフォーム固有の機能を利用する必要があります。

Windows での 1 つの可能性は、 conio.h ヘッダー ファイルを_kbhit()などの関数で使用することです。これにより、キーを読み取ろうとする前にキーが押されたかどうかをテストできるため、キーが押されていない場合は、タイマーのチェックに進むことができます。キーが押された場合、getc() がユーザーがキーを押すのをただ待っているという心配なく、getc() でそれを読み取ることができます。「\n」文字を読み取るまで、読み取ったキーを文字配列に追加し続けます。次に、sscanf() を使用して文字列を数値に変換します。

タイマー自体については、time() 関数からの戻り値を確認するだけです。

これは問題を解決するための最も効率的な方法ではありません。コードを記述すると、プログラムが _kbhit() のテストを何度もループしていることがわかるためです。

Windows でのより効率的な解決策は、重複した I/O を使用することですが、これは現在試みている範囲を超えている可能性があります。

于 2012-06-20T11:34:25.600 に答える
0

シグナルを使用して、対応するアクションをカウントダウンおよびトリガーできます。

signal(SIGALRM,countdown);
setitimer(ITIMER_REAL,&new_timeset,NULL);

カウントダウンは実行したい関数です

于 2012-06-20T15:07:16.883 に答える
0

制限時間を超えた場合は、ループを破ってメッセージを表示する前に、それぞれの時間を使用gettimeofday()して確認してください。scanf

于 2012-06-20T11:07:36.807 に答える