2

すべてのサイクルを続行するように要求せずに、キーボードからのユーザー入力でのみ停止する無限サイクルを実行する方法はありますか? Cプログラムで(for(;;)ループでエントリを読み取るCチャットを開発しています。ユーザーがメッセージを入力して送信したい場合にのみ停止する必要があります)こんにちは!

4

2 に答える 2

6

OSを指定しなかったので、POSIX準拠のOSを想定します。

selectを使用できます。これは、有限のタイムアウトまたは無期限のブロックで一連のファイル記述子 (この場合は stdin) をブロックするために使用できます。

私の推測では、これはチャット プログラムであるため、チャット tcp ソケットなどの他のファイル記述子でもこれを実行したいと思うでしょう。したがって、 1 回の呼び出しで両方の入力をテストできます。

Windows コンソールの場合、select が機能しない場合は、GetStdHandle と WaitForSingleObject/WaitForMultipleObjects を使用できるはずです。

于 2010-02-25T00:21:26.553 に答える
2

Windows でこれを行う方法はいくつかあります。VC++ を使用していると仮定すると、最も簡単な方法はおそらく を使用すること_kbhit()です。代わりに Win32 API を直接使用する場合は、呼び出しGetNumberOfConsoleInputEvents()て、戻り値がゼロでないかどうかを確認できます。

また、重複した読み取りを実行し、タイムアウト値 0 のループ呼び出しを毎回実行することもできますWaitForSingleObject。ゼロ待機は、入力があるかどうかに関係なく、すぐに戻ることを意味します。戻り値は、データがあるかどうかを示します。WAIT_TIMEOUT は、まだデータが読み取られていないことを意味し、WAIT_OBJECT0 は、処理を待っているデータがあることを意味します。

于 2010-02-25T00:56:33.253 に答える