キーボードなどの標準入力から複数の文字を指定したメモリ領域に、 リターンか、またはファイルの終わりになるまで読み込む関数が、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 個分のメモリ領域しか確保されていない
のである。従って、このプログラムはほぼ確実にメモリ破壊を引き起こす。