Re: getchar について
新城@筑波大学情報です。こんにちは。
厳密には、このあたり、Unix の都合というか、ライブラリ関数の
都合だったりするんですよね。
In article <yu4fis9wqpqx.fsf@nature.tsukuba.ac.jp>
Akira Otake <n0410272@nature.tsukuba.ac.jp> writes:
> 私はC言語を初めてまもないものです。今日はgetcharについておききしたく
> て投稿します。今回私は仕事でまわされたアンケートをCで集計しようと思い、
> ソースを書いていたのですが、うまく実行されませんでした。一文字入力して
> エンターを押すと、行程が一つ跳んでしまうようです。
端末のモードの関係もあります。たとえば、端末で cat を動かし
て、abc リターン、123 リターン、Control-D と打つとこうなりま
す。
------------------------------------------------------------
% cat
abc
abc
123
123
%
------------------------------------------------------------
でも、stty cbreak してからやると、こんな感じで動きが違ってき
ます。
------------------------------------------------------------
% stty cbreak; cat
aabbcc
112233
^D
^C
%
------------------------------------------------------------
あ、Control-D 効かないなあ。Control-C で止めました。
最近は、tcsh とかシェルが端末の状態を変えるので、";" で連続
的に実行しています。Otake さんのプログラムも、
stty cbreak;./a.out
と実行すると動きが変るかも。
> printf ("Q1. ");
> g = getchar ();
> if (g == 'y'){
y リターンと打たせるのが簡単かなあ。fgets() して"y\n" と
strcmpとか。
なんで標準で1行ごとに読むかというと、昔のコンピュータは遅く
て、しかも複数人で同時に使っていたので、1文字ごとに処理して
いたのでは重すぎたという事情があります。それでgetchar() とい
う名前でありながら、1行単位で反応したりします。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735