状态机修改C++风格注释为C风格注释

 

#include <stdio.h>

#define OK 0
#define ERR 1

typedef enum {NONE, C_STYLE, CPP_STYLE, STR, END_OF_FILE } STATE;

STATE ProcessStateNone(char ch, FILE **fpIn, FILE **fpOut);
STATE ProcessStateCPPStyle(char ch, FILE **fpIn, FILE **fpOut);
STATE ProcessStateCStyle(char ch, FILE **fpIn, FILE **fpOut);
STATE ProcessStateSTR(char ch, FILE **fpIn, FILE **fpOut);
void ProcessStateEOF(STATE state, FILE **fpOut);

int main(void)
{
    FILE *fpIn, *fpOut;
    char ch;   
    STATE state = NONE;
   
    fpIn = fopen("D:/testFile.c","r");
   
    if(NULL == fpIn)
    {
        printf("can't open source file\n");
        fclose(fpIn);
        return ERR;
    }
   
    fpOut = fopen("D:/testFile2.c","w");
    if(NULL == fpOut)
    {
        printf("can't open destination file\n");
        fclose(fpIn);
        fclose(fpOut);
        return ERR;
    }
   
    ch = fgetc(fpIn);
    while(ch != EOF)
    {
        switch(state)
        {
            case NONE: state = ProcessStateNone(ch, &fpIn, &fpOut);break;
            case C_STYLE: state = ProcessStateCStyle(ch, &fpIn, &fpOut);break;
            case CPP_STYLE: state = ProcessStateCPPStyle(ch, &fpIn, &fpOut);break;           
            case STR: state = ProcessStateSTR(ch, &fpIn, &fpOut);break;           
        }
        ch = fgetc(fpIn);           
    }
    ProcessStateEOF(state, &fpOut);
       
    fclose(fpIn);
    fclose(fpOut);
    system("pause");  
   
    return OK;
}

STATE ProcessStateNone(char ch, FILE **fpIn, FILE **fpOut)
{
     STATE stateTemp;
     char cTemp;   
     if(ch == '/')
     {       
         cTemp = fgetc(*fpIn);
         if(cTemp == '/')     // 遇到 "//"
         {
             stateTemp = CPP_STYLE;
             fputc(ch, *fpOut);
             fputc('*', *fpOut);
             return stateTemp;
         }
         if(cTemp == '*')      // 遇到 "/*"
         {
             stateTemp = C_STYLE;
             fputc(ch, *fpOut);
             fputc(cTemp, *fpOut);
             return stateTemp;
         }
         // 遇到 "/其他字符"
         stateTemp = NONE;
         fputc(ch, *fpOut);
         fputc(cTemp, *fpOut);
         return stateTemp; 
     }
    
     if(ch == '"')  // 遇到 字符串 " 双引号 
     {
         stateTemp = STR;
         fputc(ch, *fpOut);
         return stateTemp;
     }
    
     // 遇到 其他字符 
     stateTemp = NONE;
     fputc(ch, *fpOut);
     return stateTemp;
         
}

STATE ProcessStateCPPStyle(char ch, FILE **fpIn, FILE **fpOut)
{
     STATE stateTemp;
     char cTemp;   
     if(ch == '\n')  //      遇到 '\n'
     {
         stateTemp = NONE;
         fputc('*', *fpOut);
         fputc('/', *fpOut);
         fputc(ch, *fpOut);
         return stateTemp;
     }
    
     if(ch == '/')
     {       
         cTemp = fgetc(*fpIn);
         if(cTemp == '/')      //     遇到 "//"
         {
             stateTemp = CPP_STYLE;
             fputc(' ', *fpOut);
             return stateTemp;
         }
         if(cTemp == '*')     //     遇到 "/*"
         {
             stateTemp = CPP_STYLE;
             fputc(' ', *fpOut);
             return stateTemp;
         }        
     }
    
     if(ch == '*')
     {
         cTemp = fgetc(*fpIn);
         if(cTemp == '/')      //     遇到 "*/"
         {
             stateTemp = CPP_STYLE;
             fputc(' ', *fpOut);
             return stateTemp;
         } 
     }
    
     //default
     stateTemp = CPP_STYLE;
     fputc(ch, *fpOut);
     return stateTemp;      
}

STATE ProcessStateCStyle(char ch, FILE **fpIn, FILE **fpOut)
{
    STATE stateTemp;
    char cTemp;     
   
    if(ch == '/')
    {       
        cTemp = fgetc(*fpIn);
        if(cTemp == '/')      //     遇到 "//"
        {
            stateTemp = C_STYLE;
            fputc(' ', *fpOut);
            return stateTemp;
        }        
     }
    
     if(ch == '*')
     {
         cTemp = fgetc(*fpIn);
         if(cTemp == '/')    // 遇到 "*/"
         {
             stateTemp = NONE;
             fputc('*', *fpOut);
             fputc('/', *fpOut);
             return stateTemp;
         }
     }
    
     //default
     stateTemp = C_STYLE;
     fputc(ch, *fpOut);
     return stateTemp;   
}

STATE ProcessStateSTR(char ch, FILE **fpIn, FILE **fpOut)
{
    STATE stateTemp;
    char cTemp;     
   
    if(ch == '"')          //遇到字符串 " 双引号
    {
        stateTemp = NONE;
        fputc(ch, *fpOut);
        return stateTemp;
    }
   
    if(ch == '\\')
    {
        cTemp = fgetc(*fpIn); 
        if(cTemp = '"')    //遇到 "\""
        {
            stateTemp = STR;
            fputc(ch, *fpOut);
            fputc(cTemp, *fpOut);
            return stateTemp;
        }       
    }
    //default
    stateTemp = STR;
    fputc(ch, *fpOut);
    return stateTemp;     
}

void ProcessStateEOF(STATE state, FILE **fpOut)
{
      if(state == CPP_STYLE)   // c++ 风格注释处理
      {
          fputc('*', *fpOut);
          fputc('/', *fpOut);    
          return;
      }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值