2016-07-12 2 views
1

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端末に表示されているときにユーザー入力を出力(フラッシング)するのを無効にするとよいでしょう。

+0

'fflush(stdin)'を実行することは "not pretty"であるだけでなく、Cの仕様では* undefined *と書かれています。いくつかのライブラリはそれを拡張機能として実装していますが、一般的にそれを行うべきではありません。 –

答えて

1

これはTTYと直接対話することで可能です。インスピレーションのためにpasswdまたは類似のユーティリティのソースコードを調べてください。

以下の機能は、TTY入力バッファをクリアします(エラー処理は省略されています)。ユーザー入力を読み込む直前に呼び出す必要があります。

#include <sys/ioctl.h> 
#include <termios.h> 

void clear_user_input() { 
    if (isatty(STDIN_FILENO)) { 
    int fd = open(ttyname(STDIN_FILENO), O_RDONLY); 
    ioctl(fd, TCFLSH, TCIFLUSH); 
    close(fd); 
    } 
} 
+0

ありがとうございます。出来た。テキストがエコーされている間に入力された文字を印刷しないようにする方法はありますか? – user3022069

+0

'tcsetattr'のマニュアルページを見てください。' ECHO'オプションを削除する必要があります。 'TCIFLUSH'を使って入力バッファをクリアするのにも使うことができるようです。 – gudok

関連する問題