要完成這個問題要考慮以下因素:
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. 連續**/問題
/*******/
以下爲程序代碼
#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
#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;
}