注释转换

来源:互联网 发布:骑马钉排版软件 编辑:程序博客网 时间:2024/06/07 03:51

读取文件过程中的关键状态转换
主功能函数:

#include<stdio.h>         #include"convert.h"        //引自己定义的头文件int status = NULSTAT;      //定义全局变量,用于显示当前状态void do_nul(FILE *ifp,FILE *ofp)//正常无注释情况下的工作{    char c = fgetc(ifp); //从文件中读取一个字符    switch (c)      //判断字符c    {    case '/':       //若字符为‘/’,再判断下一个字符    { char s = fgetc(ifp);    switch (s)    {    case '/':        fputc('/', ofp);        fputc('/', ofp);        status = CPPSTAT;  //c为/,s为/,进入c++注释        break;    case '*':        fputc('/', ofp);        fputc('/', ofp);        status = CSTAT;   //c为/,s为*,进入c注释        break;    default:        fputc('/', ifp);  //s为普通字符,输出‘/’        break;    }}                 break;    case '\n':   //字符c为换行符,输出换行符在目标文件,状态变为无    //注释状态        fputc(c, ofp);        status = NULSTAT;        break;    case EOF:  //字符c为文件结束标志,则执行文件结束状态的工作        status = EOFSTAT;        break;    default:        fputc(c, ofp); //字符c为正常字符,则正常输出,状态变为        //无注释状态        status =NULSTAT;        break;    }}void do_c(FILE *ifp, FILE *ofp)  //c注释状态的工作{                                //此工作状态下已有“/*”    char c = fgetc(ifp);        //判断后续字符    switch (c)    {    case '*':       //若碰见字符‘*’,判断是否注释结束    {char s = fgetc(ifp);    switch (s)    {    case '/':        fputc('\n', ofp);   //   此时有“*/”        status = NULSTAT;   //状态变为无注释状态        break;    default//否则输出字符*,将字符s退回到ifp;将状态变为c状态        fputc(c, ofp);        ungetc(s, ifp);        status =CSTAT;        break;    }    }        break;    case '\n'://若字符c为换行符,输出换行符,再输出c++注释符“//”        fputc('\n', ofp);        fputc('/', ofp);        fputc('/', ofp);        status = CSTAT;//状态为C注释        break;    case EOF:        status = EOFSTAT;        break;    default:        fputc(c, ofp);        status = CSTAT;        break;    }}void do_cpp(FILE *ifp, FILE *ofp)  //c++注释状态下的工作{    char c = fgetc(ifp);    switch (c)    {    case '\n':        fputc(c, ofp);        status = NULSTAT;        break;    case EOF:        status = EOFSTAT;        break;    default:        fputc(c, ofp);        status = CPPSTAT;        break;    }}void convert(FILE *ifp, FILE *ofp)    //主函数{    while (status != EOFSTAT)  //判断状态,选择执行什么    //状态下的工作    {        switch (status)        {        case NULSTAT:            do_nul(ifp, ofp);            break;        case CSTAT:            do_c(ifp, ofp);            break;        case CPPSTAT:            do_cpp(ifp, ofp);            break;        case EOF:            break;        default:            break;        }    }}

自定义头文件
   #ifndef CONVERT_H
   #define CONVERT_H

   void convert(FILE *ifp, FILE *ofp);
    enum{NULSTAT,CSTAT,CPPSTAT,EOFSTAT};
   #define INPUT “input.txt”
    #define OUTPUT “output.txt”
   #endif                
 

    #include<stdio.h>   #include<stdlib.h>   #include"convert.h"int main(){    FILE *ifp = fopen(INPUT, "r");    FILE *ofp = fopen(OUTPUT, "w");    if (ifp == NULL || ofp == NULL)    {        fprintf(stderr,"open file error");        exit(1);    }    convert(ifp, ofp);    fclose(ifp);    fclose(ofp);    system("pause");    return 0;}

测试用例:
// 1. 一般情况
int num = 0;
/* int i = 0; */
// 2. 换行行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;
// 3. 匹配问题
/int i = 0;/*xxxxx/
// 4. 多行行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
// 5. 连续注释问题
/int a = 0;//int b = 0;/
// 6. 连续的 **/问/
// 7.C++ 注释问题

/ /*xxxxx

输出结果

// 1. 一般情况int num = 0;// int i = 0; // 2. 换行行问题// int i = 0; int j = 0;// int i = 0; int j = 0;// 3. 匹配问题//int i = 0;/*xxxxx// 4. 多行行注释问题////int i=0;//int j = 0;//int k = 0;//int k = 0;// 5. 连续注释问题//int a = 0;//int b = 0;// 6. 连续的 **/问题//*// 7.C++ 注释问题// /*xxxxxxxxxxxx*/
原创粉丝点击