注释转换
一、定义:注释转换
就是将代码中的注释转换为同一类
,比如是 C 语言 或者C++ .
C语言中,编译器默认的注释风格是 /* .........*/
C++中,编译器默认的注释风格是 // ....... (注释一行)
二、注释转换关系如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/33720adf8db59312d7c0f146d2a9fd82.png)
三、注释转换代码如下:
--------------------------------------------------头文件.h------------------------------------------------------------------
#pragma once
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#include <stdio.h>
#include <stdlib.h>
enum State
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
// pfin表示的是要读取的文件 ,pfout表示转换后输出的文件
void DoCommentConvert(FILE*pfIn, FILE*pfOut);//执行转换函数
void DoNulState(FILE*pfIn, FILE*pfOut, enum State* ps);//无状态转换
void DoCState(FILE*pfIn, FILE*pfOut, enum State* ps);//C状态转换
void DoCppState(FILE*pfIn, FILE*pfOut, enum State* ps);//CPP状态转换
#endif //__COMMENT_CONVERT_H__
------------------------------------------------源文件.c----------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#include "DoCommentConvert.h"
void DoCommentConvert(FILE*pfIn, FILE*pfOut)
{
enum State state = NUL_STATE;//初始状态为未知状态
while (state != END_STATE)//代码为结束状态时跳出循环
{
switch (state)
{
case NUL_STATE://未知状态
DoNulState(pfIn, pfOut, &state);
break;
case C_STATE://C状态
DoCState(pfIn, pfOut, &state);
break;
case CPP_STATE://C++状态
DoCppState(pfIn, pfOut, &state);
break;
default:
break;
}
}
}
void DoNulState(FILE*pfIn, FILE*pfOut, enum State* ps)//无状态转换
{
int first = 0;
int second = 0;
first = fgetc(pfIn);//从文件中读取一个字符来判断
switch (first)
{
case '/':
{
second = fgetc(pfIn);//再读取一个字符
switch (second)
{
case '*':// “/*”表示进入C状态
{
fputc('/', pfOut);
fputc('/', pfOut);
//将注释转换为C++并输出到文件
*ps = C_STATE;//未知状态转化为C状态
}
case '/':// “//”表示进入C++状态
{
fputc(first, pfOut);
fputc(second, pfOut);
*ps = CPP_STATE;//将未知状态转化为C++状态
}
break;
default://表示这个'/'是字符
{
fputc(first, pfOut);//将读取到的字符输出到文件
fputc(second, pfOut);
}
break;
}
}
break;
case EOF://代码结束
{
fputc(first, pfOut);//将EOF输出到文件
*ps = END_STATE;//状态改为结束状态
}
break;
default: //状态不变,正常输出
{
fputc(first, pfOut);//将读取的字符输出到文件
}
break;
}
}
void DoCState(FILE*pfIn, FILE*pfOut, enum State* ps)//C状态转换
{
int first = 0;
int second = 0;
int third = 0;
first = fgetc(pfIn);//从文件中读取一个字符来判断
switch (first)
{
case '*':
second = fgetc(pfIn);//再读取一个字符
switch (second)
{
case '/':// “*/”表示C注释结束 但要判断之后是不是'\n',因为C++注释是以换行结束的
{
third = fgetc(pfIn);
if (third == '\n')
{
fputc(third, pfOut);
}
else
{
fputc('\n', pfOut);//如果之后不是'\n', 需要帮它换行
ungetc(third, pfIn);//并且要将用来判断的字符从读取流中的撤销,防止下次判断时 少判断一个字符
}
*ps = NUL_STATE;//状态转换为未知状态
}
break;
default:
{
fputc(first, pfOut);
ungetc(second, pfIn);//将多余用来判断的字符撤销
}
break;
}
break;
case '\n'://换行之后要加上 // 因为C++只注释能一行
{
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
}
default:
{
fputc(first, pfOut);//将读取的字符输出到文件
}
break;
}
}
void DoCppState(FILE*pfIn, FILE*pfOut, enum State* ps)//CPP状态转换
{
int first = 0;
int second = 0;
int third = 0;
first = fgetc(pfIn);
switch (first)
{
case '\n':// 表示C++一行注释结束
{
fputc(first, pfOut);
*ps = NUL_STATE;
}
break;
default:
{
fputc(first, pfOut);
}
break;
}
}
-------------------------------------------------测试代码test.c----------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#include"DoCommentConvert.h"
int main()
{
FILE *pfIn = NULL;//定义两文件指针
FILE *pfOut = NULL;
pfIn = fopen("input.c", "r");//打开读取的文件
if(pfIn == NULL)
{
perror("open file for input:");
exit(EXIT_FAILURE);//读取失败
}
pfOut = fopen("outpur.c", "w");//打开写入的文件
if (pfOut == NULL)
{
perror("open file for output");
exit(EXIT_FAILURE);//读取失败
}
DoCommentConvert(pfIn,pfOut);//注释转换
printf("转换成功\n");
fclose(pfIn);
fclose(pfOut);
system("pause");
return 0;
}