用C语言实现从C到C++的注释转换

在C语言的学习过程中,在平时的程序编写过程中,注释这两个字估计大家都不陌生。

今天,我就用C语言简单的实现一下从C到C++的注释转换。

首先大概介绍一下从C到C++的注释转换中会遇到的几个状态:

接下来就是用C语言实现C到C++的注释转换的代码:

CommentConvert.h


#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__


#include <stdio.h>
#include <stdlib.h>

enum STATE
{
END_STATE,
NUL_STATE,
C_STATE,
CPP_STATE
};

void DoNulState(FILE*pfIn, FILE*pfOut, enum STATE* s);
void DoCState(FILE*pfIn, FILE*pfOut, enum STATE* s);
void DoCppState(FILE*pfIn, FILE*pfOut, enum STATE* s);

#endif //__COMMENT_CONVERT_H__


CommentConvert.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConvert.h"
void DoNulState(FILE *pfin, FILE *pfout, enum STATE *s)//开始无状态
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '/': //第一次读取到的字符为'/'
{
int sceond = fgetc(pfin);
switch (sceond)
{
case '/': //第二次读取的字符也为‘/’,即此注释为c++注释
{
*s = CPP_STATE; //当前状态转变为c++状态
fputc(first, pfout);
fputc(sceond, pfout);
}
break;
case '*': //第二次读取的字符也为‘*’,即此注释为c注释
{
*s = C_STATE;//当前状态转变为c状态
fputc('/', pfout);
fputc('/', pfout);
}
break;
default:// 其他注释情况不用处理,直接读取
{
fputc(first, pfout);
fputc(sceond, pfout);
}
break;
}
}
break;
case EOF://直接读取到文件结束标志,即文件结束
{
*s = END_STATE; //状态转换为空状态
}
break;
default: //第一次读取的字符不是‘/’也不是‘EOF’,即为其他情况
fputc(first, pfout);
break;
}
}
void DoCState(FILE *pfin, FILE *pfout, enum STATE *s) //C注释状态的注释转换
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '*': //注释最后第一个读取到的字符为‘*’
{
int sceond = 0;
sceond = fgetc(pfin);
switch (sceond)
{
case '/': //第二个为‘/’,即注释结束
{
*s = NUL_STATE; //状态转换为空状态

fputc('\n', pfout);
}
break;
case '*': //遇到连续注释问题 如/***/
{
fputc(first, pfout);
ungetc(sceond, pfin); //把读取到的第二个字符‘*’还回去
}
break;
default://其它非注释情况
{
fputc(first, pfout);
fputc(sceond, pfout);
}
}
}
break;
case '\n'://多行注释问题
{
fputc(first, pfout);
fputc('/', pfout);
fputc('/', pfout);
}
break;
default://结尾直接是其他非注释情况
{
fputc(first, pfout);
}
break;
}
}

void DoCppState(FILE *pfin, FILE *pfout, enum STATE *s)//c++注释状态的注释转换
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '\n': //一般情况
{
fputc(first, pfout);
*s = NUL_STATE;
}
break;
case EOF: // 文件读取结束
{
*s = END_STATE;
}
break;
default://其他非注释情况
fputc(first, pfout);
break;
}
}


test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "CommentConvert.h"

void CommentConvert(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:
DoCState(pfin, pfout, &state);
break;
case CPP_STATE:
DoCppState(pfin, pfout, &state);
break;
}
}
}
void test()
{
FILE *pfin = fopen("input.c", "r");//从文件里面读取东西
if (pfin == NULL)
{
perror("use open file read");
exit(EXIT_FAILURE);
}
FILE *pfout = fopen("output.c", "w");//往文件里面写东西
if (pfout == NULL)
{
perror("use open file write");
exit(EXIT_FAILURE);
}
//
CommentConvert(pfin, pfout);//调用转换函数
fclose(pfin);
fclose(pfout);
}
int main()
{
test();
system("pause");
return 0;
}


接下来就是对该注释转换的代码进行测试和实现

首先将test.c中的    (FILE *pfin = fopen("input.c", "r");//从文件里面读取东西 )这一条语句中的  'r' 进行修改,修改为 ‘w’ ,先让项目建立一个 input,c文件,然后将修改后的 ‘w’ 修改回原来的 ‘r’,打开 input.c进行输入,然后再运行程序,则项目中出现一个 output.c,即注释转换后的文件。

如图:


以上就是我用C语言对注释转换的理解实现。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章