基本情報技術者試験 平成14年度・春期・午後 問10 ソースプログラム
/*
基本情報技術者試験 平成14年度・春期・午後 問10
BohYoh Shibata PREPARATION
*/
#include <stdio.h>
#include <string.h>
#define MCRDEF 20
#define STRLNG 32
#define LINLNG 256
int divide_line();
char linbuf[LINLNG], token[LINLNG][LINLNG], delm[LINLNG];
char label[] = "$STRDEF";
char delmchar[] = " !\"#%&'()*+,-./:;<=>?[\\]^_{|}~\n";
main() {
FILE *sfp, *dfp;
int mcrcnt = 0, tokcnt, flg, idx1, idx2;
char orig[MCRDEF][STRLNG], expand[MCRDEF][STRLNG];
sfp = fopen("source_flie", "r");
dfp = fopen("dest_file", "w");
while(fgets(linbuf, LINLNG, sfp) != NULL) {
tokcnt = divide_line();
if(strcmp(token[0], label) == 0) {
strcpy(orig[mcrcnt], token[1]);
strcpy(expand[mcrcnt], token[2]);
mcrcnt++ ;
} else {
for(idx1 = 0; idx1 < tokcnt ; idx1++) {
flg = 0;
for(idx2 = 0; idx2 < mcrcnt; idx2++)
if(strcmp(token[idx1], orig[idx2]) == 0) {
flg = 1;
break;
}
if ( flg == 0 )
fprintf(dfp, "%s%c", token[idx1], delm[idx1]);
else
fprintf(dfp, "%s%c", expand[idx2], delm[idx1]);
}
}
}
fclose(sfp);
fclose(dfp);
}
int divide_line() {
int tokcnt = 0, lidx = 0, tidx;
do {
for(tidx = 0; strchr(delmchar, linbuf[lidx]) == NULL;
lidx++, tidx++)
token[tokcnt][tidx] = linbuf[lidx];
token[tokcnt][tidx] = '\0' ;
delm[tokcnt] = linbuf[lidx] ;
lidx++ ;
tokcnt++;
} while(linbuf[lidx - 1] != '\n');
return tokcnt;
}