Linux(Raspbian-Raspberry Pi)でCコンソールアプリケーションを使用しています。プログラムにはいくつかの文字アニメーションがあります。文字ごとにメッセージを出力します。たとえば、テキストLinuxでCで標準入力を閉じて開きます
あなたの名前を教えてください!
は、5秒後に完全に印刷されます(char by char)。
その後、ユーザーが名前を入力するよう求められます。これは、ユーザーがメッセージを印刷するのを待つ場合に問題ありません。しかし、ユーザが不慣れで、キーボードのキーをランダムに叩くと、後で入力要求が損なわれる。
上記のテキストがエコーされている間
ABC \ nefgh \ nは
でユーザータイプを想像してみて( - 入力は '\ n' が新しい行を意味します)。その場合、ユーザーは名前を正しく入力するよう求められませんが、文字列 'abc'は入力として受け入れられ、検証されます。
私の質問は、入力(バッファリング)を拒否する方法です(Linuxの場合)。私はいくつかの方法を試して、そうすることに関する多くの記事を読んだが、それらのどれも私の目的のために働いていなかった。次のように入力を求めるための責任がある
機能は次のとおりです。
int getLine(char *s, int length)
{
int i;
char c;
for (i = 0; i < length && (c = getchar()) != EOF && c != '\n'; i++)
{
if (c == '\0')
{
i--;
}
else
{
s[i] = c;
}
}
s[i] = '\0';
while (c != EOF && c != '\n')
{
c = getchar();
}
return i;
}
空行はその入力が無効とみなされ入る上記1の関数呼び出しでwhileループの助けを借りて排除されています。
私は標準入力をクローズしようとしたが、それを再度開くことができませんでした:
fclose(stdin);
と空にするバッファgetLine
前に:それはテキストファイルと同じように
char buf[BUFSIZ];
while (c = fgets(buf, BUFSIZ, stdin) != NULL);
は残念ながら、それは動作しませんでした。
fflush(stdin);
いずれも動作しませんでした。
私の目標は、テキストの書き出し中にユーザーが何かを入力したり、一時的に入力バッファリング(stdin)を無視/閉じることを防ぐことです。また、印刷中にLinux端末に表示されているときにユーザー入力を出力(フラッシング)するのを無効にするとよいでしょう。
'fflush(stdin)'を実行することは "not pretty"であるだけでなく、Cの仕様では* undefined *と書かれています。いくつかのライブラリはそれを拡張機能として実装していますが、一般的にそれを行うべきではありません。 –