1. ホーム
  2. c

[解決済み] getchar()で1文字だけ読み取るときにEnterキーを押さないようにするには?

2023-05-26 07:11:07

質問

次のコードで

#include <stdio.h>

int main(void) {   
  int c;   
  while ((c=getchar())!= EOF)      
    putchar(c); 
  return 0;
}

を押さないと 入力 で入力した文字をすべて印刷するには getchar を押さなくても、文字を押したらすぐに入力した文字が表示されるようにしたいのです。 入力 . 例えば、私が「a」という文字を押したら、その隣に別の「a」を表示したい、というようにです。

aabbccddeeff.....

しかし、'a'を押しても何も起こりません。他の文字を書くことはできますが、コピーが表示されるのは、次のような場合です。 Enter :

abcdef
abcdef

どうすればいいのでしょうか?

私は、コマンド cc -o example example.c でコンパイルしています。

どのように解決するのですか?

Linux システムでは、ターミナルの動作を変更するには stty コマンドを使ってターミナルの動作を変更することができます。 デフォルトでは、端末はすべての情報を を入力します。 が押されるまで、C プログラムに送信する前にすべての情報をバッファリングします。

プログラム自身の内部から動作を変更するための、迅速で、汚く、特に移植性のない例です。

#include<stdio.h>
#include<stdlib.h>

int main(void){
  int c;
  /* use system call to make terminal send all keystrokes directly to stdin */
  system ("/bin/stty raw");
  while((c=getchar())!= '.') {
    /* type a period to break out of the loop, since CTRL-D won't work raw */
    putchar(c);
  }
  /* use system call to set terminal behaviour to more normal behaviour */
  system ("/bin/stty cooked");
  return 0;
}

これは本当に最適な方法ではないことに注意してください。 stty cooked がプログラム終了時に望む動作であると仮定しているだけで、 元の端末設定が何であったかをチェックするわけではないからです。 また、raw モードではすべての特殊な処理がスキップされるため、 多くのキーシーケンス (例えば CTRL-C または CTRL-D など) は、プログラムで明示的に処理しなければ、実際には期待通りに動作しません。

あなたは man stty を使用すると、達成したいことに応じてターミナルの動作をより細かく制御することができます。