一.将所有注释风格全部转换成C++风格
想法:既然要转换风格,第一步搞清楚注释有几种方式:
第一种无注释,第二种C注释,第三种C++注释。
可以把这三种方式看成一种状态-status
第二步:C注释分几种情况:末尾结束,注释中又有C注释或者C++注释
C++注释同样考虑清楚。
先写测试文件:
/*int w =2;*/ int j = 0;
int i =9;
//eioshr;
/*ejre***/ //最好先考虑清楚再动手写,不然会修改很多次
int s = 3;
/*int n =9;
re =9;
int e =3;*/
int a = 0;
再写头文件:
#ifndef _COMMENT_CONVERT_H_ //条件编译,防止头文件被重复引用
#define _COMMENT_CONVERT_H_
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
enum State
{ //用枚举来标识状态,优点:防止命名污染,便于调试,维护,可以定义多个变量
NUL_STATE, // 缺点:只能是整型常量,不能是浮点型
C_STATE,
CPP_STATE,
END_STATE
};
void DoNulState(FILE *pfIn,FILE *pfOut,enum State *ps);
void DoCstateState(FILE *pfIn,FILE *pfOut,enum State *ps);
void DoCppState(FILE *pfIn,FILE *pfOut,enum State *ps);
void CommentConver(FILE *pfin,FILE *pfout);
#endif //_COMMENT_CONVERT_H_ //结束,最好注释一下
再写运行文件:
#include"CommentCovert.h"
int main()
{
FILE *pfin = NULL;
FILE *pfout = NULL;
pfin =fopen("input.c","r"); //打开一个文件,用R来读
if(pfin == NULL)
{
perror("Error opening file"); //perror 错误信息返回
exit(EXIT_FAILURE); //退出
}
pfout = fopen("pfout.c","w"); //写
if(pfout == NULL)
{
fclose(pfin);
pfin = NULL;
perror("Eorror opening file");
exit(EXIT_FAILURE);
}
CommentConver(pfin,pfout);
fclose(pfin);
pfin = NULL;
fclose(pfout);
pfout = NULL;
return 0;
}
接着写函数接口文件:
#include"CommentCovert.h"
void CommentConver(FILE *pfin,FILE *pfout)
{
enum State status = NUL_STATE; //默认状态值是无注释
while(status != END_STATE)
{
switch(status)
{
case NUL_STATE:
DoNulState(pfin,pfout,&status);
break;
case C_STATE:
DoCstateState(pfin,pfout,&status); //c注释
break;
case CPP_STATE:
DoCppState(pfin,pfout,&status); //c++注释
break;
}
}
}
void DoNulState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
int first = fgetc(pfIn);
switch(first)
{
case '/':
{
int second = fgetc(pfIn);
switch(second)
{
case '/':
{
fputc('/',pfOut);
fputc('/',pfOut);
*ps = CPP_STATE;
}
break;
case '*':
{
fputc('/',pfOut);
fputc('/',pfOut);
*ps = C_STATE;
}
break;
case EOF:
*ps = END_STATE;
break;
default:
{
fputc(first,pfOut);
fputc(second,pfOut);
}
break;
}
}
break;
case EOF:
*ps = END_STATE;
break;
default:
{
fputc(first,pfOut);
break;
}
}
}
void DoCstateState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
int first = fgetc(pfIn);
switch(first)
{
case '*':
{
int second= fgetc(pfIn);
switch(second)
{
case '/':
{
int third = fgetc(pfIn);
fputc('\n',pfOut);
*ps = NUL_STATE;
}
break;
default :
{
int four = 0;
ungetc(second,pfIn); //把读出的那个字符返回去
fputc(first,pfOut);
}
break;
}
}
break;
case '\n':
{
;
}
break;
default:
fputc(first,pfOut);
break;
}
}
void DoCppState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
int first = fgetc(pfIn);
switch(first)
{
case '\n':
{
fputc(first,pfOut);
*ps = NUL_STATE;
}
break;
case EOF:
*ps = END_STATE;
default:
fputc(first,pfOut);
break;
}
}
最后看结果是不是转换成功
//int w =2;
int j = 0;
int i =9;
//eioshr;
//ejre**
int s = 3;
//int n =9;re =9;int e =3;
int a = 0;