0

たとえば、ユーザーはls またはを入力できls commandます。このコマンドは、毎回表示されるとは限りません。ユーザーがコマンドを入力したかどうかを確認するにはどうすればよいですか? のscanf()場合、コマンドが存在すればプログラムは正常に動作しますが、コマンドが存在しない場合は入力を待ちます。プログラムにこの入力を待たせたくない

4

3 に答える 3

3

selectはこの目的に使用できます。これにより、(ブロッキング)読み取りを行う前に、読み取るものがある場合にstdin(タイムアウトまたは非ブロッキング)を照会できます。

select()およびpselect()を使用すると、プログラムは複数のファイル記述子を監視し、1つ以上のファイル記述子が何らかのクラスのI / O操作(入力可能など)に対して「準備完了」になるまで待機できます。ブロックせずに対応するI/O操作(たとえば、read(2))を実行できる場合、ファイル記述子は準備ができていると見なされます。

于 2012-09-20T17:03:33.337 に答える
0

すべての標準Cライブラリ入力関数は行指向です。つまり、ユーザーが何かを入力するか、少なくともEnterキーを押すまで待機します。

それよりもインタラクティブに入力に応答したい場合は、標準ライブラリ以外のものを使用する必要があります。正確に何を利用できるかは、コーディングしているプラ​​ットフォームによって異なります。

于 2012-09-20T17:03:17.810 に答える
0

使用しないでくださいscanf。代わりに、fgets行全体を読み取るために使用します。次に、行を処理します。たとえば、トークン化して ( strtok)、含まれる単語数を計算します。

char buf[1024];

fgets(buf, sizeof buf, stdin);    // returns after user presses Enter
                                  // (should check that this is not NULL)
char * p = strtok(buf, " \t\n");
while (p)
{
    // p now points to a token
    p = strtok(NULL, " \t\n");
}
于 2012-09-20T17:06:20.620 に答える