要完成这个问题要考虑以下因素:
1. 换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;
2. /*与*/匹配问题
/*int i = 0;/*xxx*/
3. 多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int n = 0;
4. 连续注释问题
/**//**/
5. 连续**/问题
/*******/
以下为程序代码
1. 头文件
#ifndef __COMMENT_CONVERT_H_
#define __COMMENT_CONVERT_H_
#include <stdio.h>
#include <stdlib.h>
enum STATE // 设置状态
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoConvert(FILE* pfIn, FILE* pfOut); //选择状态
void DoNul_State(FILE* pfIn, FILE* pfOut); //无状态
void DoC_State(FILE* pfIn, FILE* pfOut); //C状态
void DoCpp_State(FILE* pfIn, FILE* pfOut); //CPP状态
#endif
2. 源文件
#include "CommentConvert.h"
enum STATE state = NUL_STATE;
void DoConvert(FILE* pfIn, FILE* pfOut)
{
while(state != END_STATE)
{
switch(state)
{
case NUL_STATE:
DoNul_State(pfIn,pfOut);
break;
case C_STATE:
DoC_State(pfIn,pfOut);
break;
case CPP_STATE:
DoCpp_State(pfIn,pfOut);
break;
}
}
}
void DoNul_State(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
int second = 0;
switch(first)
{
case '/':
second=fgetc(pfIn);
switch(second)
{
case '/':
fputc(first, pfOut);
fputc(second, pfOut);
state = CPP_STATE;
break;
case '*':
fputc(first, pfOut);
fputc('/', pfOut);
state =C_STATE;
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
break;
case EOF:
state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void Check(FILE* pfIn, FILE* pfOut) //处理下一个字符并将指针返回当前位置
{
int check_n = fgetc(pfIn);
if(check_n != '\n')
{
fputc('\n', pfOut);
fseek(pfIn,-1,1);
}
else
fputc('\n', pfOut);
}
void DoC_State(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
int second = 0;
int third = 0;
switch (first)
{
case '\n':
fputc('\n', pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
break;
case '*':
second = fgetc(pfIn);
switch(second)
{
third = fgetc(pfIn);
case '/':
{
Check(pfIn,pfOut);
state = NUL_STATE;
}break;
case '*':
fputc(first, pfOut);
while(1)
{
third = fgetc(pfIn);
if( '/' == third)
{
Check(pfIn,pfOut);
state = NUL_STATE;
}
break;
if( '*' == third)
fputc(second, pfOut);
if( ( '/'!= third ) && ( '*' != third ) )
{
fputc(second, pfOut);
fputc(third, pfOut);
}
third = fgetc(pfIn);
}break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}break;
default:
fputc(first, pfOut);
break;
}
}
void DoCpp_State(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
switch(first)
{
case '\n':
fputc(first, pfOut);
state = NUL_STATE;
break;
case EOF:
state = END_STATE;
break;
default :
fputc(first, pfOut);
break;
}
}
3.测试文件
#include "CommentConvert.h"
void test()
{
FILE* pfIn = fopen("input.c","r");
FILE* pfOut = NULL;
if( NULL == pfIn)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pfOut = fopen("output.c","a");
if( NULL == pfOut)
{
perror("open file for w");
fclose(pfIn);
exit(EXIT_FAILURE);
}
DoConvert(pfIn,pfOut);
fclose(pfIn);
fclose(pfOut);
}
int main()
{
test();
return 0;
}