結論

gets()は使うな。
strcpy()で領域破壊の可能性を拭い切れないならstrdup()でも使え。
だからと言ってstrncpy()は別な問題を発生させるから心して使え。
いっそ、sprintf()で%.*sでも使うほうがよっぽどましだ。
strcpy()が一切使えないなんていってると、strlen()さえ使えないことになるぞ。

こんなところかな。