gets関数とfgets関数

1740 ワード

1、gets関数


gets関数はstdinストリームから文字列を読み出し、改行やEOFが受け入れられるまで停止し、bufferポインタが指す文字配列に格納します.改行文字は読み出し列の内容ではなく、読み出した改行文字を‘0’の空白文字に変換して文字列を終了する.
gets関数は無限に読み取ることができ、上限を判断しないので、プログラマはbufferの空間が十分に大きく、読み取り操作を実行するときにオーバーフローしないようにしなければならない.オーバーフローすると、複数の文字がスタックに書き込まれ、スタックの元の内容が上書きされ、1つ以上の非相関変数の値が破壊されます.この事実はgets関数がおもちゃプログラムにのみ適用されることを招き、このような状況を避けるために、gets()をfgets(stdin)(fgetsは実際に標準入力、すなわちほとんどの場合のキーボード入力を読み取ることができる)で置き換えることができる.V 7のマニュアル(1979年)では、getsが改行を削除するために、getsは改行をバッファに格納しない('0'で置き換えられる)と説明されています.
注意:
linuxとwindowsのファイルは改行文字で符号化が異なるため、linuxの改行は0、windowsの改行は130である.
LINUXでCプログラムをコンパイルすると、warning:the`gets'function is dangerous and should not be usedという警告が表示されます.

2、fgets関数


fgets関数は、ファイル構造体ポインタstreamからデータを読み出し、1行ずつ読み出します.読み込まれたデータはbufが指す文字配列に保存され、bufsize-1文字(bufsize番目の文字には'0')が最大で読み込まれ、ファイル内の行がbufsize-1文字未満であれば、その行を読み終わる.行(最後の改行を含む)の文字数がbufsize-1を超える場合、fgetsは不完全な行のみを返しますが、バッファは常にNULL文字で終わり、fgetsの次の呼び出しは行を読み続けます.
関数が正常にbufに戻り、ファイルの最後に失敗したり、NULLに戻ったりします.したがって,fgetsの戻り値から直接関数がエラーで終了したか否かを判断することはできず,feof関数またはferror関数を用いて判断すべきである.
注意:
getsが端末から読み込む文字列は0で終わり、fgetsは終了する.
例:
fgets() 
fgets(char * s,int size,FILE * stream);// fgets(tempstr,9,stdin)//tempstr  char[10] ,9 ( '\0'),stdin 。  
#include <stdio.h>  
int main ( ) {  
    char name[20];  
   printf("
: "); fgets(name, sizeof(name)-1, stdin);//stdin fputs(name, stdout); //stdout return 0; }

fgets()を使用してファイルを読み込む場合、bufsizeはその行の文字(改行文字'''を含まない)の総数より2(複数の2つ、1つの保存ファイル自体の'改行、1つの保存文字列自体の終了フラグ'0')を大きくし、ファイルは読み続けず、この行だけが読み終わると、ファイルへのポインタが自動的に次の行にシフトします.