ていうか、replaceの位置自体、ptempの終端から2000バイト以上も前の位置なんだから、
そこにもし50バイト書き込んでもちょっと上書きされる部分が増えるだけで、
別に不正な領域に書き出してるわけじゃないじゃん?
もしおかしい領域に書き込んでたら、strncpyの時点でエラーが出るはずだしね。
fputsでエラーが出る理由がわからん。
0x0000000へのアクセス違反っぽいエラーだけど。
なぜmemcpyに変えるだけで、fputsでエラーが出なくなるのかが意味不明。
別に書き換えてる領域は変わんないんだし。

面倒になってきたからゆるーく考えるか、スルーして下さい。
再現コードも作る時間ないかもしれんから