getchとgetcharにおける改行

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
サモサ

getchとgetcharにおける改行

#1

投稿記事 by サモサ » 11年前

入力した文字を区別して、文字数を表示するというプログラムを作りました。
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;
}

Bull
記事: 149
登録日時: 11年前

Re: getchとgetcharにおける改行

#2

投稿記事 by Bull » 11年前

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における改行

#3

投稿記事 by サモサ » 11年前

返信と参考プログラムをありがとうございます。
分かりました。
ただひとつ疑問に思ったのですが、
コンソール入出力関数にはどのようなメリットがあるのでしょうか?

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

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

Bull
記事: 149
登録日時: 11年前

Re: getchとgetcharにおける改行

#4

投稿記事 by Bull » 11年前

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

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

サモサ

Re: getchとgetcharにおける改行

#5

投稿記事 by サモサ » 11年前

分かりました。
丁寧に説明していただき、ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る