注释转换
- 源文件convert.c实现c注释转换为c++注释:
#include<stdio.h>
#include"convert.h"
static int status = NULSTAT;
void do_null_work(FILE *ifp,FILE *ofp) //普通状态
{
char c = fgetc(ifp);
switch (c)
{
case '/': //当读了'/'时,判断下一个字符
{
int s = fgetc(ifp);
switch (s)
{
case '/': // "//"转向c++状态
fputc('/', ofp);
fputc('/', ofp);
s = CPPSTAT;
break;
case '*': // "/*"转向c状态
fputc('/', ofp);
fputc('/', ofp);
status = CSTAT;
break;
default: // 仍为普通状态
ungetc(s, ifp); // 需要后退一个字符,将前一个字符输出
fputc(c, ofp);
break;
}
}
break;
case EOF: //必须考虑文件结束标志,否则进入死循环
status = EOFSTAT;
break;
default:
fputc(c, ofp);
status = NULSTAT;
break;
}
}
void do_cpp_work(FILE *ifp,FILE *ofp) //cpp状态相关操作
{
char c = fgetc(ifp);
switch (c)
{
case '\n':
fputc('\n', ofp);
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, ofp);
status = CPPSTAT;
break;
}
}
void do_c_work(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:
ungetc(s, ifp);
fputc(c, ofp);
break;
}
}
break;
case '\n':
fputc('\n', ofp);
fputc('/', ofp);
fputc('/', ofp);
break;
case EOF:
status = EOFSTAT;
break;
default:
fputc(c, ofp);
status = CSTAT;
break;
}
}
void convert(FILE *ifp, FILE *ofp)
{
while (status != EOFSTAT)
{
switch (status)
{
case NULSTAT:
do_null_work(ifp, ofp);
break;
case CPPSTAT:
do_cpp_work(ifp, ofp);
break;
case CSTAT:
do_c_work(ifp, ofp);
break;
case EOFSTAT:
break;
default:
break;
}
}
}
- 提供给外部接口包含头文件convert.h
//#pragma once //防止头文件被重复引用 1.
#ifndef __CONVER_H__ // 2.
#define __CONVER_H__
enum{NULSTAT,CSTAT,CPPSTAT,EOFSTAT}; //枚举类型定义四种状态,标志当前所处的状态
void convert(FILE *ifp, FILE *ofp);
#endif
- 测试代码main.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> //库包含文件定义在自己定义的包含文件之前,防止隐式包含
#include<stdlib.h>
#include"convert.h"
#define INPUT "input.txt"
#define OUTPUT "output.txt"
int main()
{
FILE *ifp=fopen(INPUT, "r");
FILE *ofp = fopen(OUTPUT,"w");
if (ifp == NULL || ofp == NULL)
{
perror("file open erro");
exit(1);
}
convert(ifp, ofp);
fclose(ifp);
fclose(ofp);
system("pause");
return 0;
}
- 测试用例 input.txt
// 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*/
- 转换结果output.txt
// 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