[解決済み] 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
を使用すると、達成したいことに応じてターミナルの動作をより細かく制御することができます。
関連
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
C++の配列コピー
-
関数 'malloc' の暗黙の宣言に対する解決策
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] flexible array member not at end of structエラーの原因は何ですか?
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する
-
[解決済み】ユーザーから1文字だけ読み取るには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] C 言語で const char* を char* に変換するには?
-
[解決済み] char *とchar[]の違い [重複]
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Cコードの単体テスト【終了しました
-
[解決済み] C言語でランダムなint型を生成するには?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?