検索文字列置換

/*-----------------------------------------------------------
	心霊研究所引用テキスト変換プログラム
-----------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <stddef.h>

#define FOUND 0
#define GYOUMAX 500
#define TIKAN_N 4
void change_strings(char *pa, char *pb[TIKAN_N], char *pc[TIKAN_N], char *pd);

int main(int argc, char **argv)
{
	FILE *fpi;		/*読み込むファイルのポインタ*/
	FILE *fpo;		/*書き出すファイルのポインタ*/
	char buff[GYOUMAX];
	char *b[TIKAN_N] = {"<p", "/p", "&hellip;", "&nbsp;"};	/*検索文字列*/
	char *c[TIKAN_N] = {"<div", "/div", "", ""};			/*置換文字列*/
	char output[GYOUMAX*2];
	int i;
	long int pos;
	
	if(argc != 2)
		printf("input output file name error");
		
	else {
		argv++;
		if((fpi = fopen(*argv, "r")) == NULL)
			printf("input file can't open\n");
		else {
			if((fpo = fopen("temp.txt", "w")) == NULL)
				printf("temp.txt can't open\n");
			else {
				while(fgets(buff, GYOUMAX, fpi) != NULL) {
					change_strings(buff, b, c, output);
					fputs(output, fpo);
				}
				
				fclose(fpo);
			}
			fclose(fpi);
		}
	}
	return 0;
}

void change_strings(char *pa, char *pb[], char *pc[], char *pd)
						/*pa : もとの文字列へのポインタ*/
						/*pb : 検索文字列へのポインタ*/
						/*pc : 置換文字列へのポインタ*/
						/*pd : 新たな文字列へのポインタ*/
{
	int na, min_nb = strlen(pb[0]);			/*aの文字列の長さ*/
	int nb[TIKAN_N];			/*bの文字列の長さ*/
	int nc[TIKAN_N];			/*cの文字列の長さ*/
	int h, i, j;	/*添字*/
	
	/*文字列の長さを求める*/
	for(h = 0; h < TIKAN_N; h++){
		nb[h] = strlen(pb[h]);
		if(min_nb > nb[h]) min_nb = nb[h];
		nc[h] = strlen(pc[h]);
	}
	na = strlen(pa);
	
		/*aの先頭よりbをcに置換しながらdにコピーする*/
	for(i=0, j=0; i<na-min_nb; i++, j++){
		for(h = 0; h < TIKAN_N; h++){
			if(i+nb[h]>=na) continue;
			if(strncmp(pa+i, pb[h], nb[h]) == FOUND){
				strcpy(pd+j, pc[h]);
				i += nb[h]-1;
				j += nc[h]-1;
				break;
			}
			else
				*(pd+j) = *(pa+i);
		}
	}
	strcpy(pd+j, pa+i);
}

tikan.bat

tikan base.txt
temp.txt