入力バッファでPEEK、およびCに余分な文字をフラッシュ
質問
私はCで1つの文字入力を受信したい場合は、どのように私は余分な文字が送られたかどうかを確認するだろう、そうであれば、どのように私はそれをクリアするのでしょうか?
のgetc(STDIN)のように働く機能はありますが、これは、文字を入力するようにユーザに要求しませんので、私はちょうどwhile(getc(stdin)!=EOF);
置くことができますか?または関数がバッファ内の次の文字でPEEKと、それがNULL(または何があるでしょう)を返さない場合、私は標準入力をフラッシュ(Notherの)関数を呼び出すことができます?
編集
だから、今、scanf関数は、トリックをやっているように見えるが、それはアップ改行まで、<私>全の文字列を読み取るために取得する方法はありますか?むしろ、最も近い空白に比べて?私はちょうどフォーマット文字列に「%S%S%S」または何でも置くことができます知っているが、私は、任意の数のスペースを扱うことができますか?
解決
あなたは、入力ストリームをフラッシュすることはできません。あなたが行う場合は、未定義の動作を起動されます。あなたの最善の策は行うことです。
int main() {
int c = getchar();
while (getchar() != EOF);
return 0;
}
scanf
魔法を使用するには:
#include <stdio.h>
#include <stdlib.h>
#define str(s) #s
#define xstr(s) str(s)
#define BUFSZ 256
int main() {
char buf[ BUFSZ + 1 ];
int rc = scanf("%" xstr(BUFSZ) "[^\n]%*[^\n]", buf);
if (!feof(stdin)) {
getchar();
}
while (rc == 1) {
printf("Your string is: %s\n", array);
fflush(stdout);
rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
if (!feof(stdin)) {
getchar();
}
}
return 0;
}
他のヒント
あなたは入力の行全体を読み取るためにgetline
使用することができます。
また(自分の元の質問に応じて)、あなたが読み込まれる追加の文字があるかどうかを確認するために標準入力にselect
呼び出すpoll
たりすることができます。
私は今日、同様の問題があったが、私は仕事に思える方法を見つけました。私はあなたの状況の詳細を知らないので、それはあなたのために仕事をしたりしません場合、私は知りません。
私は、キーボードからの単一の文字を取得する必要がルーチンを書いて、それは3つの特定のキーストローク(「1」、「2」、または「3」)のいずれかである必要があります。それはそれらの一つではない場合は、プログラムが別の試みのために戻って、エラーメッセージとループを送信する必要があります。
問題はその私がGETCHAR(によって返される入力文字)に加えて、(プログラムにキーストロークを送信します)「と入力し」キーストロークは入力バッファに保存されています。その(非印刷)改行文字は、その後、改行文字ではないいずれかの「1」、「2」は(2番目のエラーメッセージでさらに得られ、エラー訂正ループでGETCHAR()機能によって返されます、また '3'。)
私は時々、先に自分の取得し、代わりに単一の文字を入力するので、私はこれらのオプションのいずれかが要求されること、ファイル名を入力しますので、問題はさらに複雑になります。それから私は、画面を下にスクロールし、エラーメッセージの長いリストで、その結果、バッファ内の不要な文字の文字列全体を持っています。
クールではない。
それを修正しているようだ何、しかし、次のようである。
c = getchar(); // get first char in line
while(getchar() != '\n') ; // discard rest of buffer
最初の行は、実際に私が入力した文字を使用するものです。 2行目は入力バッファに残っているどのような残留物を処分します。これは単に、入力バッファから一度に文字を引っ張るループを作成します。文がループしている間、場所を取るために指定されたアクションはありません。それは単に文字を読み取り、それが改行ではない場合は、次のために戻って行きます。それは改行を見つけると、ループが終了すると、それはプログラムのビジネスの次の順に進みます。
私たちは、このように、キーボードバッファをクリアする機能を作ることができます:
#include <stdio.h>
void clear_buffer(){
char b;
//this loop take character by character in the keyboard buffer using
//getchar() function, it stop when the variable "b" was
//enter key or EOF.
while (((b = getchar()) != '\n') && (b != EOF));
}
int main()
{
char input;
//get the input. supposed to be one char!
scanf("%c", &input);
//call the clearing function that clear the buffer of the keyboard
clear_buffer();
printf("%c\n",input); //print out the first character input
// to make sure that our function work fine, we have to get the
// input into the "input" char variable one more time
scanf("%c", &input);
clear_buffer();
printf("%c\n",input);
return 0;
}
の文字の多くを取る読み取り(以上1、多分256)を使用して、実際に返されるどのように多くの参照してください。あなたが1以上を取得する場合、あなたは知っています。あなたは一つだけを取得する場合、それはすべての利用可能があったのです。
あなたはプラットフォームを言及していない、とこれは非常に急速にかなりトリッキー取得します。おそらく、あなたが後にした一つの文字と改行 - たとえば、UNIX(Linux)の上で、通常のメカニズムは、データの行を返します。それとも直前の文字を送信するために、^ D(デフォルト)を入力するユーザーを説得します。それともあなたは(そのようvi
とemacs
行うなどのプログラムのように)rawモードにターミナルを置くために制御機能を使用します。
Windowsでは、私はとてもよく分からない - 。私は何が必要ありませんgetch()
機能があると思います。
なぜあなたはscanf関数を使って、uは文字列全体を取得することができ、代わりにgetc関数のscanf関数を使用しないでください。