首先我们应该知道,在C语言中 ,编译器默认的注释风格是 /* .........*/ ,而在C++中 ,编译器默认的注释风格是 // ....... 注释一行。这两种注释风格是可以互相转换的。
下面给上转换后的结果:
对该过程进行分析:
程序代码如下:
CommentConvert.h
#ifndef __COMMEENT_CONVERT_H__
#define __COMMEENT_CONVERT_H__
#include <stdio.h>
#include <stdlib.h>
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoNulState(FILE* pfIn, FILE* pfOut, enum STATE* state);
void DoCState(FILE* pfIn, FILE* pfOut, enum STATE* state);
void DoCppState(FILE* pfIn, FILE* pfOut, enum STATE* state);
#endif//__COMMEENT_CONVERT_H__
CommentConvert.c
#define _CRT_SECURE_NO_WARNINGS
#include "CommentConvert.h"
void DoNulState(FILE* pfIn, FILE* pfOut, enum STATE* s)
{
int first = fgetc(pfIn);
switch (first)
{
case '/':
{
int second = fgetc(pfIn);
switch (second)
{
case '/':
*s = CPP_STATE;//遇到//转换至C++状态
fputc(first, pfOut);
fputc(second, pfOut);
break;
case '*'://将/*转换成//,转换至C状态
*s = C_STATE;
fputc('/', pfOut);
fputc('/', pfOut);
break;
default:
fputc(second, pfOut);
}
}
break;
case EOF:
*s = END_STATE;//文件结束,转换至结束状态
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCState(FILE* pfIn, FILE* pfOut, enum STATE* s)
{
int first = fgetc(pfIn);
switch (first)
{
case '*':
{
int second = fgetc(pfIn);
switch (second)
{
case '/'://遇到*/转换至无状态,将*/去除或换行
{
*s = NUL_STATE;
int third = fgetc(pfIn);
if (third != '\n')
{
fputc('\n', pfOut);
ungetc(third, pfIn);
}
else
{
fputc(third, pfOut);
}
}
break;
case '*':
fputc(first, pfOut);
ungetc(second, pfIn);
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case '\n'://多行注释的处理
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
break;
case EOF://文件结束,转换至无状态
*s = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCppState(FILE* pfIn, FILE* pfOut, enum STATE* s)
{
int first = fgetc(pfIn);
switch (first)
{
case '\n':
*s = NUL_STATE;//C++状态注释一行结束,转换至无状态
fputc(first, pfOut);
break;
case EOF:
*s = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
#define _CRT_SECURE_NO_WARNINGS
#include "CommentConvert.h"
void CommentConvert(FILE* pfIn, FILE* pfOut)
{
enum STATE state = NUL_STATE;
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
DoNulState(pfIn, pfOut, &state);
break;
case C_STATE:
DoCState(pfIn, pfOut, &state);
break;
case CPP_STATE:
DoCppState(pfIn, pfOut, &state);
break;
}
}
}
void test()
{
FILE* pfIn = 0;
FILE* pfOut = 0;
pfIn = fopen("input.c", "r");
if (pfIn == NULL)
{
perror("open for read");
exit(EXIT_FAILURE);
}
pfOut = fopen("output.c", "w");
if (pfOut == NULL)
{
perror("open for write");
fclose(pfIn);
exit(EXIT_FAILURE);
}
CommentConvert(pfIn, pfOut);
fclose(pfIn);
fclose(pfOut);
}
int main()
{
test();
system("pause");
return 0;
}
在文件夹中可以找到该程序,该程序的运行结果已经在上面给出: