用C语言实现注释转换,将代码当中有关C语言的注释全部转换为C++注释形式。
Commentcovert.h
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#include
#include
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoConvertWork(FILE* pfIn, FILE* pfOut);
void DoNULState(FILE* pfIn, FILE* pfOut);
void DoCState(FILE* pfIn, FILE* pfOut);
void DoCppState(FILE* pfIn, FILE* pfOut);
#endif
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentCovert.h"
void test()
{
FILE* pfIn = fopen("input.txt", "r");
if (NULL == pfIn)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
FILE* pfOut = fopen("output.txt", "a");
if (NULL == pfOut)
{
perror("open file for write");
fclose(pfIn);
exit(EXIT_FAILURE);
}
DoConvertWork(pfIn, pfOut);
fclose(pfIn);
fclose(pfOut);
}
int main()
{
test();
return 0;
}
Commentcovert.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentCovert.h"
enum STATE state = NUL_STATE;
void DoConvertWork(FILE* pfIn, FILE* pfOut)
{
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
DoNULState(pfIn, pfOut);
break;
case C_STATE:
DoCState(pfIn, pfOut);
break;
case CPP_STATE:
DoCppState(pfIn, pfOut);
break;
}
}
}
void DoNULState(FILE* pfIn, FILE* pfOut)
{
int first=0;
int second=0;
first = fgetc(pfIn);
switch (first)
{
case '/':
second = fgetc(pfIn);
if (second == '/') // 遇到*/ 说明c的注释结束,切换到无状态
{
fputc('/', pfOut);
fputc('/', pfOut);
state = CPP_STATE;
}
else if (second == '*') // 遇到* 说明是c的注释,切换到c的注释处理
{
state = C_STATE;
fputc(first, pfOut);
fputc('/', pfOut);
}
else
{
fputc(first, pfOut);
fputc(first, pfOut);
}
break;
case EOF:
state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCState(FILE* pfIn, FILE* pfOut) //C语言的注释处理
{
int first = 0;
int second = 0;
int third = 0;
first = fgetc(pfIn);
switch (first)
{
case '*':
second = fgetc(pfIn);
if (second == '/')
{
state = NUL_STATE;
third = fgetc(pfIn);
if (third != '\n')
{
fputc('\n', pfOut);
ungetc(third, pfIn);
}
else
{
ungetc(third, pfIn);
}
}
else
{
fputc(first, pfOut);
ungetc(second, pfIn);
}
break;
case '\n':
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCppState(FILE* pfIn, FILE* pfOut) //C++语言的注释处理
{
int first = fgetc(pfIn);
switch (first)
{
case '\n':
fputc(first, pfOut);
state = NUL_STATE;
break;
default:
if (first == EOF)
{
state = END_STATE;
}
else
{
fputc(first, pfOut);
}
break;
}
}
程序运行:
程序运行后:将代码当中有关C语言的注释全部转换为C++注释形式