next up previous contents
Next: 18.5 課題 18 Up: 18. 構造体 I Previous: 18.3 初期化

18.4 標準関数 -- gets()

キーボードなどの標準入力から複数の文字を指定したメモリ領域に、 リターンか、またはファイルの終わりになるまで読み込む関数が、gets である。

例 12
        main(){
                char str[80];
                while(gets(str)!=NULL){
                    printf("%s\n",str);
                }
        }

この例は、ファイルの終わり、又はキーボードから ctrl+D が入力されるまで、 入力を複製するだけのプログラムである。 gets() は、ファイルの終わり、又はエラーの時は、システムで決められた特別 な値 NULL を返す。

但し、get() では、改行は捨てられるので、改行したい場合は、自分で改行を 指示しなければならない点に注意。

ここで、配列名 str はあるアドレスを 指している事に注意しよう。つまり、gets() は引数に指定されたメモリ領域 に標準入力を書き込むだけである。この時に、メモリ領域が確保されているかどうか などは検査しないので、次のプログラムは誤っている。

間違った例
        main(){
                char *str;
                while(gets(str)!=NULL){
                    printf("%s\n",str);
                }
        }

例 12 との違いはたった一ヶ所で、char str[80]char *str になっているだけであるが、前者が文字 80 個分のメモリ領域を確保するのに 対して、後者は文字へのポインタ変数 1 個分のメモリ領域しか確保されていない のである。従って、このプログラムはほぼ確実にメモリ破壊を引き起こす。



Noriyo Kanayama