要求
int a = 10;
// 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/
分析
代码片
头文件
#ifndef __COMMENTCONVERT_HEADFILE__
#define __COMMENTCONVERT_HEADFILE__
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
enum STATE
{
NUL,
C,
CPP,
END
};
void CommentConvert(FILE *pfin, FILE * pfout);
void DoNULConvert(FILE *pfin, FILE * pfout, enum STATE * state);
void DoCConvert(FILE *pfin, FILE * pfout, enum STATE * state);
void DoCPPConvert(FILE *pfin, FILE * pfout, enum STATE * state);
#endif
源文件
#include"标头.h"
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void CommentConvert(FILE *pfin, FILE * pfout)
{
enum STATE state = NUL;//初始化状态 为 无注释状态
while (state != END)
{
switch (state)
{
case NUL:
{
DoNULConvert(pfin, pfout, &state);
}
break;
case C:
{
DoCConvert(pfin, pfout, &state);
}
break;
case CPP:
{
DoCPPConvert(pfin, pfout, &state);
}
break;
default:
break;
}
}
}
void DoNULConvert(FILE *pfin, FILE * pfout, enum STATE * state)
{
int start = 0;
int next = 0;
start = fgetc(pfin);
switch (start)
{
case '/':
{
next = fgetc(pfin);
switch (next)
{
case '*':// 表示进入C语言注释状态
{
fputc('/', pfout);
fputc('/', pfout);
*state = C;//状态转换为 C注释状态
}
break;
case '/':// 表示进入C++注释状态
{
fputc(start, pfout);
fputc(next, pfout);
*state = CPP; //状态转换为 C++注释状态
}
break;
default:
{
fputc(start, pfout);
fputc(next, pfout);
}
break;
}
}
break;
case EOF:
{
fputc(start, pfout);
*state = END;
}
break;
default://表示遇到的不是注释 ,状态不变
{
fputc(start, pfout); //将读取的字符输出到文件
}
break;
}
}
//c状态转换
void DoCConvert(FILE *pfin, FILE * pfout, enum STATE * state)
{
int start = 0;
int next = 0;
int then = 0;
start = fgetc(pfin);
switch (start)
{
case '*'://遇到'*'表示C语言注释状态
{
next = fgetc(pfin);
switch (next)
{
case '/':
{
then = fgetc(pfin);
if (then == '\n')
{
fputc(then, pfout);
}
else
{
fputc('\n', pfout);
ungetc(then, pfin);
}
*state = NUL;
}
break;
default:
{
fputc(start, pfout);
ungetc(next, pfin);
}
break;
}
}
break;
case '\n':
{
fputc(start, pfout);
fputc('/', pfout);
fputc('/', pfout);
}
break;
default:
fputc(start, pfout);
break;
}
}
//c++状态转换
void DoCPPConvert(FILE *pfin, FILE * pfout, enum STATE * state)
{
int start = 0;
int next = 0;
int then = 0;
start = fgetc(pfin);
switch (start)
{
case '\n':
{
fputc(start, pfout);
*state = NUL;
}
break;
default:
fputc(start, pfout);
break;
}
}
测试文件
#include "标头.h"
int main()
{
FILE *pfin = NULL;
FILE *pfout = NULL;
pfin = fopen("input.c", "r");
if (pfin == NULL)
{
perror("input file open:");
exit(EXIT_FAILURE);
}
pfout = fopen("output.c", "w");
if (pfout == NULL)
{
perror("output file open:");
fclose(pfin);
exit(EXIT_FAILURE);
}
CommentConvert(pfin, pfout);
printf("注释转换成功\n");
fclose(pfin);
fclose(pfout);
system("pause");
return 0;
}