すいません
strncpyでもいけました。

ですが、monthfilenameのバッファを適当な別のバッファに変えて、

sprintf(tempbuf,"テスト(%c%c%c%c年%c%c月分)",monthbuf[0],monthbuf[1],monthbuf[2],monthbuf[3],monthbuf[4],monthbuf[5]);
strncpy(replace,tempbuf,sizeof(tempbuf));

ってしないとだめでした。
monthfilenameを使うとやっぱりエラーが出ます。
まあmonthfilenameっていう使わなくなったバッファを使いまわした罰だと思いますが、
sprintf実行した時点でちゃんと終端文字が付加されるので、
おかしくなるはずはないと思うんですが何でですかねぇ。