>>奈々
既に諸氏が言っていることに加えて。
> string_before=(char *)malloc(sizeof(bufd));
bufdはchar*だから(大抵の場合)string_beforeは4バイトしか確保されない。
> strncpy(buf,string_buf,strlen(string_buf)-strlen(buf2));
サイズ範囲の指定はbuf2-string_bufとか書いたほうがいい。
あとstrncpyはサイズ指定が実際の長さを下回った場合NULL文字を挿入しないから
このままだと直後のstrcatで落ちる。

あと、こういう実装だと"pos"→"position"みたいな置換をさせようとすると
無限ループしてメモリ違反で落ちる。

まぁ、最初はそんなもんだから。がんがれ。