2

C で 1 文字の入力を受け取りたい場合、余分な文字が送信されたかどうかを確認するにはどうすればよいですか。

getc(stdin) のように機能するが、ユーザーに文字の入力を求めない関数はありますwhile(getc(stdin)!=EOF);か? または、バッファ内の次の文字を覗く関数で、NULL (またはそこにあるもの) を返さない場合は、stdin をフラッシュする (別の) 関数を呼び出すことができますか?

編集

だから今、scanfはそのトリックをやっているようですが、改行まで文字列全体を読み取る方法はありますか? 最も近い空白ではなく?「%s %s %s」などをフォーマット文字列に入れることができることはわかっていますが、任意の数のスペースを処理できますか?

4

6 に答える 6

4

入力ストリームをフラッシュすることはできません。実行すると、未定義の動作が呼び出されます。あなたの最善の策は、次のことです。

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;
}
于 2009-05-10T07:01:30.637 に答える
1

getline入力の全行を読み取るために使用できます。

または、(元の質問に応じて)selectまたはpollstdinに電話して、読み取る追加の文字があるかどうかを確認することもできます。

于 2009-05-10T08:28:44.030 に答える
1

今日も同様の問題があり、うまくいくように見える方法を見つけました。私はあなたの状況の詳細を知らないので、あなたに合うかどうかわかりません。

キーボードから単一の文字を取得する必要があるルーチンを作成しています。これは、3 つの特定のキーストローク ('1'、'2'、または '3') のいずれかである必要があります。それらのいずれでもない場合、プログラムはエラーメッセージを送信し、もう一度試行するためにループバックする必要があります。

問題は、入力した文字が getchar() によって返されることに加えて、'Enter' キーストローク (キーストロークをプログラムに送信する) が入力バッファに保存されることです。その (非印刷) 改行文字は、エラー修正ループの getchar() 機能によって返され、さらに 2 番目のエラー メッセージが表示されます (改行文字は「1」でも「2」でもないため)。 、「3」でもありません。)

この問題はさらに複雑です。なぜなら、私はときどき先を行ってしまい、1 文字を入力する代わりに、これらのオプションの 1 つが要求するファイル名を入力するからです。次に、バッファーに不要な文字列全体が含まれているため、画面を下にスクロールするエラーメッセージの長いリストが表示されます。

クールではありません。

ただし、それを修正したように見えるのは次のとおりです。

c = getchar();  // get first char in line
while(getchar() != '\n') ; // discard rest of buffer

最初の行は、私が入力した文字を実際に使用する行です。2 行目では、入力バッファーに残っている残留物をすべて破棄します。入力バッファから一度に 1 文字ずつプルするループを作成するだけです。ステートメントのループ中に実行するアクションは指定されていません。単純に文字を読み取り、それが改行でない場合は次の行に戻ります。改行が見つかると、ループが終了し、プログラム内の次の作業に進みます。

于 2009-05-27T03:58:27.533 に答える
1

次のように、キーボード バッファをクリアする関数を作成できます。

#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;
}
于 2016-09-28T21:07:27.733 に答える
0

多くの文字 (1 以上、おそらく 256) を使用する読み取りを使用して、実際に返される文字数を確認します。複数取得した場合は、わかります。1つしか入手できない場合は、それが利用可能なすべてです。

プラットフォームについて言及していませんが、これは非常にトリッキーになります。たとえば、Unix (Linux) では、通常のメカニズムではデータ行が返されます。おそらく、検索対象の 1 文字と改行です。または、ユーザーに ^D (デフォルト) と入力して前の文字を送信するように説得することもできます。または、制御関数を使用して端末を raw モードにすることもできます (viemacsdo などのプログラムのように)。

Windows では、よくわかりません。必要なことを行うgetch()機能があると思います。

于 2009-05-10T07:00:18.470 に答える
0

getc の代わりに scanf を使用しないのはなぜですか。scanf を使用すると、文字列全体を取得できます。

于 2009-05-10T07:09:55.093 に答える