注释转换

    在C语言中注释采用以界定符/*开始*/结束,编译器将落在/*和*/之间的所有内容都当作注释。而C++单行注释以双斜杠//开始,以换行符结束,当前编译器将//右侧的所有内容进行注释,这种注释可以包含任何文本,包括额外的双斜线。

注释转换可以将C语言的/*注释转换成//风格的注释

.h文件

#ifndef __TEST__
#define __TEST__
#include <stdio.h>
#include <stdlib.h>
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"
enum STATE
{
 NUL_STATE,  //0
 C_STATE,  //1
 CPP_STATE,  //2
 END_STATE  //3
};
void CommentConvert(FILE *pfread, FILE *pfwrite);                                  //状态转换
void Do_NUL_State(FILE *pfread, FILE *pfwrite);                                      //空状态操作
void Do_C_State(FILE *pfread, FILE *pfwrite);                                         //C注释状态操作
void Do_CPP_State(FILE *pfread, FILE *pfwrite);                                    //C++注释状态操作
#endif


.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
enum STATE state = NUL_STATE;
int first = 0;
int second = 0;
int third = 0;
void Do_NUL_State(FILE *pfread, FILE *pfwrite)
{
 first = fgetc(pfread);
 switch (first)
 {
 case '/':
  second = fgetc(pfread);
  if (second == '*')
  {
  // fputc('\n', pfwrite);
   fputc('/', pfwrite);
   fputc('/', pfwrite);
   state = C_STATE;
  }
  else if (second == '/')
  {
   fputc(first, pfwrite);
   fputc(second, pfwrite);
   state = CPP_STATE;
  }
  else
  {
   fputc(first, pfwrite);
   fputc(second, pfwrite);
  }
  break;
 case '\n':                                                                          //C注释中的多行注释 
  fputc('\n', pfwrite);
  break;
 case EOF:                                                                      //文件结束标志 
  state = END_STATE;
  break;
 default:                                                                           //不是注释的字符 
  fputc(first, pfwrite);
  break;
 }
}

void Do_C_State(FILE *pfread, FILE *pfwrite)
{
 first = fgetc(pfread);
 switch (first)
 {
 case '*':
  second = fgetc(pfread);
  switch (second)
  {
  case '/':                                                                            //连续的注释问题/**//**/ 
   third = fgetc(pfread);
   if (third == '/')
   {
    ungetc(third, pfread);
    state = NUL_STATE;
    break;
   }
   state = NUL_STATE;
   if (third != '\n')
   {
    fputc('\n', pfwrite);
   }
    fputc(third, pfwrite);
    break;
  case '*':                                                                                // 连续的**/问题 
   third = fgetc(pfread);
   fputc(first, pfwrite);
   if (third == '/')
   {
    state = NUL_STATE;
   }
   break;
  default:                                                                              //不是注释的字符 
   fputc(first, pfwrite);
   fputc(second, pfwrite);
   break;
  }
  break;
 case '\n':                                                                           //C注释中的多行注释 
  fputc('\n', pfwrite);
  fputc('/', pfwrite);
  fputc('/', pfwrite);
  break;
 case EOF:                                                                        //文件结束标志 
  state = END_STATE;
  break;
 default:                                                                            //不是注释的字符 
  fputc(first, pfwrite);
  break;
 }
}
void Do_CPP_STATE(FILE *pfread, FILE *pfwrite)
{
 first = fgetc(pfread);
 switch (first)
 {
 case '\n':
  fputc(first, pfwrite);
  state = NUL_STATE;
  break;
 case EOF:
  fputc(first, pfwrite);
  state = END_STATE;
  break;
 default:
  fputc(first, pfwrite);
  break;
 }
}
void CommentConvert(FILE *pfread, FILE *pfwrite)
{
 while (state != END_STATE)
 {
  switch (state)
  {
  case NUL_STATE:
   Do_NUL_State(pfread, pfwrite);                                              //空状态
   break;
  case C_STATE:
   Do_C_State(pfread, pfwrite);                                                //C注释状态
   break;
  case CPP_STATE:
   Do_CPP_STATE(pfread, pfwrite);                                          //C++状态
  case END_STATE:
   break;
  default:
   break;
  }
 }
}

主函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
int main()
{
 FILE *pfread = NULL;
 FILE *pfwrite = NULL;
 printf("转换开始!\n");
 pfread = fopen(INPUTFILENAME, "r");
 if (NULL == pfread)
 {
  perror("open file for read\n");
  exit(EXIT_FAILURE);
 }
 pfwrite = fopen(OUTPUTFILENAME, "w");
 if (NULL == pfwrite)
 {
  fclose(pfread);
  perror("open file for write\n");
  exit(EXIT_FAILURE);
 }
 CommentConvert(pfread, pfwrite);
 fclose(pfread);
 fclose(pfwrite);
 printf("转换结束!\n");
 system("pause");
 return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值