検索文字列置換
/*----------------------------------------------------------- 心霊研究所引用テキスト変換プログラム -----------------------------------------------------------*/ #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", "…", " "}; /*検索文字列*/ 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