恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

getchar関数と getche関数の違い(その1)

今回はgetchar関数とgetche関数の違いに関するメモです(さりげなく _getche関数も登場しますが)。

環境

 Microsoft Visual Studio Community 2019
 Version 16.6.5
 
 Windows 10 Pro
 Version 1903

 

getchar関数を使ってみました

#include <stdio.h>

int main(void)
{
    char ch;

    ch = getchar();
    printf("入力した文字: %c", ch);

    return 0;
}

 

「a」と入力した後、Enterを押さないとprintf文が実行されませんでした。

建前としては、getchar()は1文字を読み込むはずなのですが、ラインバッファ方式なのでEnterが押されるまで、文字を読み込み続けるらしいです。

 

試しに、「abc」と入力した後でEnterを押したら、

 入力した文字: a

とだけ出力されました。

 

書籍によると「b」や「c」はラインバッファに入ったままになるのだとか・・・。
ラインバッファに入ったままの文字は、その後の入力要求(例:scanf)の使用時に取り込まれるそうです。

 

getche関数を使ってみました

#include <stdio.h>
#include <conio.h>   /* getche()を使う場合、conio.h のインクルードが必要 */

int main(void)
{
    char ch;

    ch = getche();
    printf("入力した文字: %c", ch);

    return 0;
}

 

ビルドしてみたら

warning C4996: 'getche':
The POSIX name for this item is deprecated.
Instead, use the ISO C and C++ conformant name: _getche.
See online help for details.

というメッセージが出たものの、ビルドはできました。

getcharと違い、文字を1つ入力したら(Enterを押さなくても)printf文が実行されました。

 

getche関数と標準の入力関数を併用してはいけないらしい

中途半端な理解に終わっている点をメモ・・・。


手元にある書籍によると、getche()を使う場合は、同じプログラムの中で他の標準関数を使用してはいけないとのこと。
MS社のVisual C++コンパイラについて、scanf()等のC標準の入力関数は getche()と互換性が無いので、標準の入力関数をgetche()と併用したい時はcscanf()などの特別なコンソール版を使う必要がある、と書かれているのですが、読んでいる本が古いので今もそれが当てはまるのか不明です。

 

_getche関数を使ってみました

#include <stdio.h>
#include <conio.h>  /* _getche()を使う場合もconio.hは必要です */

int main(void)
{
    char ch;

    ch = _getche();
    printf("\nタイプした文字: %c", ch);

    return 0;
}

warning C4996 の出力内容に従い、_getche()を使ってみました。
当然ですが、今度はwarningは出ませんでした。

挙動は getche() を使った場合と同じで、文字を1つ入力したら(Enterを押さなくても)printf文が実行されました。

 

今後やること

gccとかclangとかでビルドするとどうなるのか気になります・・・。
時間があったらやってみます^^;