2017-02-09 21 views
0

私は、ユーザが入力を押すことなく、ユーザ入力の文字を文字単位で読むC言語のプログラム例を書こうとしています。私はhereと表示されたコードを使用して、ちょっとした問題でうまく動作します。私はenterを押すとユーザーの入力をすべて処理したいのですが、system(/bin/stty raw);を使用すると、プログラムはそれを検出できなくなります。次のように:Enterを押す前にユーザー入力を読み取る方法は?

int n, i; 
char buffer[50]; 
system ("/bin/stty raw"); 
for(i=0; i<30 ; i++) { 

    buffer[i] = getchar(); 
    printf("%d\n", buffer[i] == '\n'); //this prints 0 when I press enter 
    if(buffer[i] == '\n'){ 
     break; 
    } 
} 
printf("%s\n",buffer); 

system ("/bin/stty cooked"); 

このとき、ユーザーがEnterキーを押したことを検出する方法はありますか?

私が実際にやっていることは、Enterキーを押す前にユーザーの入力を読み取ることですが、入力したときに何かをすることです。私がこれを行うと思ったもう一つの方法は、文字ではなく、例えばfgets(buffer, 255, stdin);を使用している場合、ユーザーがenterを押す前にstdinのバッファを読み取る方法がありますか?私はwhile((c=getchar())!= '.'){}のように、別の文字のユーザー入力を終了するためにEnterキーを使用したい場合、hereを使用することはできません。

+0

'raw'では、' icrnl'や 'inlcr'がオンになっていますか?これらは入力に対するCRからNL( '\ r'から' \ n')へのマッピングに関連しています。あなたのコードで '' system( "/ bin/stty -a"); 'を試してみてください。つまり、rawモードで作業するときに '\ r'の代わりに' \ r'をトラップする必要があるか、 '\ n'をトラップする必要があるかのいずれかです。 –

+0

これはすべてのコードです。本当に、私が残したのは 'int main()'と 'return 0;'です。 –

+0

あなたが私に対処しているのなら、あなたはもっとMCVEを作ったはずがないと言っているわけではありません。私は 'stty raw'コマンドがあなたの端末の多くの設定を変更しており、それらのいくつかはCR(' \ r')からNL( '\ n')への変換に関連していることを言います。私はあなたが 'stty raw'を行う前と後に設定を見つけることを実験できることも示唆しています。これは何が変更されたのかを判断するのに役立ちます。また、答えで指摘されているように、POSIXの ''ヘッダと関連する関数を使用して、より直接的に端末設定を管理する必要があります。 –

答えて

3

stty rawで無効にする端末の設定は、\r\nを調和させる責任もあります。

stty -icanon min 1を使用すると、バッファリングを無効にすることも、\r\nを入力することもできます。

PS:TCGETS/TCSETS ioctlsを使用して、sttyを呼び出してその後の調理モードを強制するのではなく、以前の設定を取得、変更、再適用することをお勧めします。

+0

申し訳ありませんが、私はかなり理解していませんでした。あなたは\ nの代わりに\ rを調べるべきですか?もしそうなら、それは問題ありません。 編集:気にしないで、私はそれを試しました、それは 'buffer [i] == '\ r'''で動作します –

関連する問題