2016-12-13 16 views
-2

どのように私はループ上のタイマーを行うことができますか、その中に私はscanfを持っていますか?C:timer inside/loop + scanf?

時間が過ぎてユーザーが入力していない場合、ループ/ whileが終了しています。トリビアのように..

while(30 sec) 
{ 
scanf("%d,&try); 
} 

30秒間が終わると、ループが上にあります。唯一の4

私がすることができ、ユーザは...

#include <stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include <time.h> 

TNXを含ん!

+0

Windows? Linux? –

+2

標準的なCの解決策はありません。プラットフォーム固有の機能が必要です。 Unix/Linuxでは、 'alarm()'を使って 'scanf'呼び出しを中断することで、最も簡単にすることができます。しかし、これは非常に原油であり、一般的にほとんどの状況に適用されるわけではなく、あなたの特定の問題を解決するのに十分です。 – hyde

+1

sry ... on Windows! –

答えて

3

C標準ライブラリのみでは不可能なので、リストにある4つのヘッダーでは不十分です。 scanfはユーザーがenterを押すのを待つだろうし、30秒後にプラットフォーム固有の機能や特別なライブラリ(プラットフォーム特有の機能を隠す)を使わずに中断させる方法はない。


一般的な解決策のガイドラインとして、端末から文字を取得して特定の時間後に中断することができる方法が必要です。したがって、時間制限に達するまで、またはユーザーがEnterを押すまで、文字で文字を読み取り、それらをバッファに入れます(たとえば、getchar()では不可能ですが、1文字を与えてもまだブロックされます)。ユーザーがenterを押すまで、入力した文字を1つずつ入力するまで)。その後

あなたは(スペースまで多分か、またはあなたがN桁を読んだことがある、またはあなたがやりたいものは何でもするまで)全体のラインを持っていたら、文字列を解析し、必要な整数を得るためにsscanfまたはstrtolまたは何を使用しています。

0

これは可能です。 Look at this question.

Look here kbhitの例です。あなたはそれにいくつかの制限があります。詳細はコメントを見てください。

+0

OPはWindowsではなくMSを使用していますDOS。実際、誰もMS DOSを使用していません。それを推奨しないでください。 – Lundin

+0

もっと一般的には、キーボードを* raw-unbuffered *モードにしてから、非ブロック化の実装にタイムアウトを指定して 'select'を使うことができます。 C標準のlibヘッダを使って書かれた標準の 'kbhit'型関数がいくつかあります。 –

+0

@ Lundin私はConioがWindowsターミナルでかなり大丈夫だと思います。それがMS-DOSで始まったからといって、それを避ける理由ではありません。他の理由があるかもしれません(間違いなく短い睡眠でポーリングする必要があるようです)が、MS-DOSの履歴は1つではありません。 – hyde