BohYoh.comトップページへ

基本情報技術者試験 平成14年度・春期・午後 問10 ソースプログラム

C言語講座へ  情報処理技術者試験対策講座へ  情報処理技術者試験対策講座(C言語)へ 
/*
    基本情報技術者試験          平成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;
}