Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のバッファとは?入出力バッファの仕組みとクリア方法を解説

C言語におけるバッファ(buffer)とは、データを一時的に保存しておくための記憶領域のことです。キーボードやディスプレイなど、すべての入出力(I/O)デバイスには、それぞれ専用のI/Oバッファが用意されています。

バッファの基本的な仕組み

プログラムが要求している数よりも多くの値を入力として渡すと、余分な値は自動的に入力バッファ内に保持されます。そして、次の入力処理が存在する場合、このバッファ内のデータは自動的に次の入力関数へ渡されてしまいます。

そのため、次の入力を受け付ける前に、あらかじめバッファをクリアしておくことが重要です。

サンプルプログラム

以下は、バッファの動作を確認できるC言語のプログラム例です。

#include<stdio.h>
void main(){
    int a,b;
    printf("\n Enter a value: ");
    scanf("%d",&a);
    printf("\n Enter b value: ");
    scanf("%d",&b);
    printf("\n a+b=%d ",a+b);
    getch();
}

実行結果

上記のプログラムを実行すると、通常は次のような結果になります。

Enter a value: 1
Enter b value: 2
a+b=3

バッファに値が残った場合の動作

続けて、もう一度同じプログラムを実行してみます。今度は変数aに対して「1 2 3」と複数の値を一度に入力し、bの入力は省略してみましょう。

Enter a value: 1 2 3
Enter b value: a+b=3

bの値を入力していないにもかかわらず、プログラムは正しく計算できています。これは、先ほど入力した「2」が入力バッファ内にまだ残っており、2回目のscanf()がその値を自動的に読み込んだためです。これがバッファの存在を示す典型的な例です。

バッファをクリアする関数

実際の開発では、標準入力バッファのデータを削除したい場合に、flushall()やfflush()といった関数を使用します。主な関数は以下の通りです。

  • flushall() − stdio.hで定義されている関数で、I/Oバッファからデータをまとめて削除できます。

  • fflush() − stdio.hヘッダーファイルで定義されている関数で、入力または出力バッファのメモリをクリアするために使用されます。

  • fflush(stdin) − 入力バッファのメモリをクリアします。scanf文を書く前に使用することが推奨されています。

  • fflush(stdout) − 出力バッファのメモリをクリアします。printf文を書く前に使用することが推奨されています。

なお、C言語の標準規格ではfflush(stdin)の動作は未定義とされているため、移植性を重視するコードでは注意が必要です。コンパイラや環境によっては、getchar()を繰り返し呼び出して改行まで読み捨てる方法などが代替手段として用いられることもあります。

  1. ネットワークのインターフェースとサービスとは?基本概念と種類をわかりやすく解説

    ネットワークサービスとは 一般的にネットワークサービスとは、アプリケーション層以上で動作し、コンピュータネットワーク上で利用されるアプリケーションのことを指します。 ネットワークサービスは、データの保存(ストレージ)、操作(処理)、提示(プレゼンテーション)、通信といった機能を提供します。実装方式としては、クライアント・サーバ型アーキテクチャ、またはピアツーピア(P2P)型アーキテクチャが採用されます。 サービスインターフェースとは サービスインターフェースは、SOA(Service-Oriented Architecture:サービス指向アーキテクチャ)を実現するための仕組みです。これによ

  2. C言語における静的メモリ割り当てとは?仕組みとサンプルコードで徹底解説

    C言語でプログラムが使用するメモリは、大きく分けて「静的メモリ割り当て」と「動的メモリ割り当て」の2つの方法で確保されます。 静的メモリ割り当て(Static Memory Allocation)とは 静的メモリ割り当てとは、変数のサイズがプログラムの実行前に決定され、固定サイズの領域として割り当てられる方式です。一度確保されたメモリは、明示的に解放することはできません。プログラム内で宣言された変数に対して、あらかじめメモリが割り当てられます。 静的メモリ割り当ての主な特徴 アドレス演算子「&」を使って変数のアドレスを取得し、ポインタに代入することができます。 メモリはコンパイル時