UNIXの使い方
(ラズパイZeroで学ぶLinux)
 

-- プログラムの構造化例 --

ここまでC言語の基本文法を解説してきました。
ここまでの内容で小さいなプログラムを作る知識を得ました。そこでプログラムが大きくなってくると、どの様な事が起きるかを考えていきます。
小さなプログラムを考える場合、例えばキーボードからの入力待ちを行い入力された文字を表示するプログラムを作る場合
プログラムは2つのパートからなることが分かります。
1.1はキーボードから文字を入力する。
2.もう一つは得た文字を表示する。
これをC言語でプログラムする場合、
1.キーボードは標準入力と呼ばれるデバイス(装置)からデータを得てそれを文字列変数に格納する。
2.1.で取得した文字列データを標準出力と呼ばれるデバイスに書き込む。
という動作をプログラムにします。
ここで出てくる標準入力や標準出力は stdio.h と呼ばれるヘッダーファイルに定義されていて、
1.はその定義を使い入力デバイスからの読取り関数 fgets( )を呼び出す。
2.はその定義を使い出力デバイスに書き込む関数 fputs( )を呼び出す。
事でプログラムが完成します。
実は、こんな単純なプログラムですが直にコンピュータの命令であるアセンブラで操作しようとすると相当な量のプログラムになりますが、ほとんどの部分はカーネル(kernel)というプログラムの中に既に書かれておりそれを呼び出すとできるようになっています。
ここでfgets(),fputs()という関数について調べてみます。調べ方は man fgets と man fputs で調べることが出来ます。
man fgesを見てみると
参照するヘッダーファイルが
#include <stdio.h>
関数の呼び出し方が
char *fgets(char *s, int size, FILE *stream);
fgets()の動作説明を見てみると「 fgets() は stream から最大で size - 1 個の文字を読み込み、 s が指すバッファーに格納する。」
なので s の部分には文字列を格納する大きさ size の変数を持っていくことと入力用のFILE型ストリームが必要であるとが分かります。
ではFILE型のストリームはどの様に定義されているかというと man stdio で調べると
FILE *stdin;
FILE *stdout;
FILE *stderr;
という3つがありそのあとの説明にはstdinが入力ストリームであることが書かれています。
なのでキーボードから文字を読むという動作は、
あらかじめ確保した文字バッファ
#define SIZE 100 char buf[SIZE]; にstdinから文字を読取るので fgets(buf, SIZE, stdin) という呼び出し方をすればよいことが分かります。
このようにUNIXやLinuxではオンラインマニュアルの man コマンドを使うことで C言語の関数や定義された内容を知ることが出来ます。
また、FILE型のようにファイル操作を行う為に構造化した変数を決め扱いやすくすることで構造化プログラムというプログラム方法が広がりました。
では最後にプログラムを完成させてみると

#include <stdio.h>

#define SIZE 100
int main()
{
    char buf[SIZE];

    fgets(buf, SIZE, stdin);
    fputs(buf, stdout);
    return 0;
}

このように構造化により本当は大きなプログラムを単純化することが可能になります。

To Top