ページ 11

getchとgetcharにおける改行

Posted: 2014年8月03日(日) 00:19
by サモサ
入力した文字を区別して、文字数を表示するというプログラムを作りました。
Enterキーを押すと、do-whileを抜けだして、文字の個数を表示します。
このプログラムを作っている最中に気づいたのですが

getchar関数を使っているときはEnterキーを押すと(\n)が入力されます
getch関数を使っているときはEnterキーを押すと(\r)が入力されます

EnterキーはCR(carriage return)=復帰を意味するキーだとは聞いたのですが
それなら何故getch,getcharも(\r)で統一しないのしょうか?

何故このような違いがでるのでしょうか?
教えてくださいお願いします。

OSはWindows7です
また参考として下にプログラムを記しておきます。

#include <stdio.h>
#include <conio.h>

int main(void){

int kazu=0,eji=0,kugiri=0;
char ch;

do{
ch=getche();

switch(ch){

case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
kazu++;
break;

case ',':
case '.':
kugiri++;
break;

default:
eji++;
break;

}

}while(ch !='\r');

printf("\n数字は%d個\n英字は%d個\n区切り文字は%d個\n",kazu,eji,kugiri);

return 0;
}

Re: getchとgetcharにおける改行

Posted: 2014年8月03日(日) 11:41
by Bull
getch() と getchar() では目的が違います。
getch() がコンソール入出力関数であるのに対し
getchar() は標準入出力関数です。
getch() がリダイレクトすることは出来ないのに
対し、getchar() はリダイレクトされていれば、
ファイルからの入力も出来ます。

getchar() は文字の入力のための関数で、多くの
場合行単位の入力になります。Enterキーを押した
と言うことは、行の終わりを意味するので、改行
(\n) に変換されます。

一方 getch() はそういった変換は一切行われません。
文字の入力と言うよりも、キーの入力といった方が
いいかもしれません。

以下のプログラムでは、getchar() では取得できない
[F?]キーや[Delete]キーなども取得できます。

コード:

#include <stdio.h>
#include <ctype.h>
#include <conio.h>

int main(void)
{
	for (;;) {
		int c = _getch();
		if (isgraph(c))
			printf("%c (%d)\n", c);
		else
			printf("  (%d)\n", c);
	}
	return 0;
}
※終了する時は[Ctrl]+[Break]です

Re: getchとgetcharにおける改行

Posted: 2014年8月03日(日) 20:53
by サモサ
返信と参考プログラムをありがとうございます。
分かりました。
ただひとつ疑問に思ったのですが、
コンソール入出力関数にはどのようなメリットがあるのでしょうか?

ラインバッファ処理をしないからリアルタイムな受け答えが可能 
みたいなことは聞いたのですが…

この他にメリットはあるでしょうか?

Re: getchとgetcharにおける改行

Posted: 2014年8月03日(日) 22:32
by Bull
サモサ さんが書きました:この他にメリットはあるでしょうか?
メリットと言えるかどうかわかりませんが、getch() は入力をエコーバックしません。
例えば、パスワード入力などの場合 getchar() ではエコーバックしてしまうので、
何らかの処置が必要になります。

コンソール入出力関数のメリットは特別には考えとことがなかったです。
前にも書きましたが、目的が違うので使い分けが肝要ではないでしょうか。

Re: getchとgetcharにおける改行

Posted: 2014年8月04日(月) 21:10
by サモサ
分かりました。
丁寧に説明していただき、ありがとうございました。