scanf や gets という標準ライブラリ関数は 実際的なプログラムを組み出すと使わなくなります。 最大入力文字数を指定できないからです。
文字数を制御していないことによるメモリ領域破壊の問題は、 C言語で文字列を扱う strcpy や strcat, sprintf 等標準ライブラリ全般 にわたる注意事項なのですが、プログラム内だけのことならばプログラマ が予め各サイズに注意すれば最悪の事態をさけるように作ることができます。
しかし、gets や scanf でキーボードやファイルから入力すると、 文字列の最大長が不定なために、いくら大きめの入力バッファを用意しても 溢れてしまう危険があります。例えば、行バッファとして1メガバイト確保 しておいても、1メガ+1バイトの入力があると暴走してしまう可能性がでてき ます。
利用者に文字数制限を言い渡して注意深く作業してもらうとしても、 誤操作の危険は避けられませんし、ファイルからの入力でも、 入力ファイルの指定を間違える危険や人間が手で作ったデータだったり 他のプログラムが生成したファイルの場合、最大文字数に誤りがないという 前提を立てれません。
このため入力文字数の指定できる fgetsを用いることになります。
これならば、入力文字数が長すぎても、せめて暴走はさせないよう、
できればエラーを検出するようにプログラムを
組むことができます。
※ 実際のプログラムで gets や scanf が使われているかは別として 外部データとのやりとり(キー入力とか通信とか)の部分で書きこみ バッファ溢れのチェックをしていないと、単に暴走の危険だけでなく クラックされる可能性も出てくる、いわゆるセキュリティホールに なってしまうかもしれません。