项目要求:
将源文件中C语言注释(/**/)转换为C++注释(//),其它内容不变。
思路框图:
测试用例:
input.c
在工程路径下建立文件
源码实现:
test.c
#include"comment_convert.h"
void test()//测试函数
{
FILE *pfread = NULL;
FILE *pfwrite = NULL;
pfread = fopen(IN_FILENAME, "r");//打开“input.c”
if (pfread == NULL)
{
perror("Open reaf file failure");
exit(EXIT_FAILURE);
}
pfwrite = fopen(OUT_FILENAME, "w");//打开“output.c”
if (pfwrite == NULL)
{
perror("Open write file failure");
fclose(pfread);
exit(EXIT_SUCCESS);
}
DoComment_convert(pfread, pfwrite);//转换函数
fclose(pfread);//关闭“input.c”
fclose(pfwrite);//关闭“output.c”
}
int main()//主函数
{
test();
return 0;
}
comment_convert.h
#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define IN_FILENAME "input.c"//所要转换文件名
#define OUT_FILENAME "output.c"//转换后文件名
typedef enum STATE//枚举类型,每个常量代表一种状态
{
NUL_STATE,//空状态
C_STATE,//C状态
CPP_STATE,//C++状态
END_STATE//结束状态
} STATE;
Do_nul(FILE *pfin, FILE *pfout, STATE *tmp);//空状态处理函数
Do_c(FILE *pfin, FILE *pfout, STATE *tmp);//C注释状态处理函数
Do_cpp(FILE *pfin, FILE *pfout, STATE *tmp);//C++注释处理函数
void DoComment_convert(FILE *pfin, FILE *pfout);//转换函数
#endif//__COMMENT_CONVERT_H__
comment_convert.c
#include"comment_convert.h"
Do_nul(FILE *pfin, FILE *pfout, STATE *tmp)//空状态处理函数
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '/':
{
int second = 0;
second = fgetc(pfin);
switch (second)
{
case '*':
fputc(first, pfout);
fputc(first, pfout);
*tmp = C_STATE;
break;
case '/':
fputc(second, pfout);
fputc(second, pfout);
*tmp = CPP_STATE;
break;
}
}
break;
case EOF:
*tmp = END_STATE;
break;
default:
fputc(first, pfout);
break;
}
}
Do_c(FILE *pfin, FILE *pfout, STATE *tmp)//C注释状态处理函数
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '*':
{
int second = 0;
second = fgetc(pfin);
switch (second)
{
case '/':
{
int third = 0;
third = fgetc(pfin);
switch (third)
{
case '\n':
fputc(third, pfout);
*tmp = NUL_STATE;
break;
case '/':
{
int fourth = 0;
fourth = fgetc(pfin);
switch (fourth)
{
case '/':
*tmp = CPP_STATE;
break;
case '*':
//*tmp = C_STATE;
break;
default:
fputc('\n', pfout);
fputc(third, pfout);
fputc(fourth, pfout);
*tmp = NUL_STATE;
break;
}
}
break;
default:
fputc('\n', pfout);
fputc(third, pfout);
*tmp = NUL_STATE;
break;
}
}
break;
default:
fputc(first, pfout);
ungetc(second, pfin);
break;
}
}
break;
case '\n':
fputc(first, pfout);
fputc('/', pfout);
fputc('/', pfout);
break;
case EOF:
*tmp = END_STATE;
break;
default:
fputc(first, pfout);
break;
}
}
Do_cpp(FILE *pfin, FILE *pfout, STATE *tmp)//C++注释处理函数
{
int first = 0;
first = fgetc(pfin);
switch (first)
{
case '\n':
fputc(first, pfout);
*tmp = NUL_STATE;
break;
case EOF:
*tmp = END_STATE;
break;
default:
fputc(first, pfout);
break;
}
}
void DoComment_convert(FILE *pfin, FILE *pfout)//转换函数
{
STATE state = NUL_STATE;
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
Do_nul(pfin,pfout,&state);
break;
case C_STATE:
Do_c(pfin, pfout, &state);
break;
case CPP_STATE:
Do_cpp(pfin, pfout, &state);
break;
case END_STATE:
break;
}
}
printf("转换完成!\n");
}
1763

被折叠的 条评论
为什么被折叠?



