在C语言中注释采用以界定符/*开始*/结束,编译器将落在/*和*/之间的所有内容都当作注释。而C++单行注释以双斜杠//开始,以换行符结束,当前编译器将//右侧的所有内容进行注释,这种注释可以包含任何文本,包括额外的双斜线。
注释转换可以将C语言的/*注释转换成//风格的注释
.h文件
#ifndef __TEST__
#define __TEST__
#define __TEST__
#include <stdio.h>
#include <stdlib.h>
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"
#include <stdlib.h>
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"
enum STATE
{
NUL_STATE, //0
C_STATE, //1
CPP_STATE, //2
END_STATE //3
};
{
NUL_STATE, //0
C_STATE, //1
CPP_STATE, //2
END_STATE //3
};
void CommentConvert(FILE *pfread, FILE *pfwrite); //状态转换
void Do_NUL_State(FILE *pfread, FILE *pfwrite); //空状态操作
void Do_C_State(FILE *pfread, FILE *pfwrite); //C注释状态操作
void Do_CPP_State(FILE *pfread, FILE *pfwrite); //C++注释状态操作
void Do_NUL_State(FILE *pfread, FILE *pfwrite); //空状态操作
void Do_C_State(FILE *pfread, FILE *pfwrite); //C注释状态操作
void Do_CPP_State(FILE *pfread, FILE *pfwrite); //C++注释状态操作
#endif
.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
enum STATE state = NUL_STATE;
int first = 0;
int second = 0;
int third = 0;
int second = 0;
int third = 0;
void Do_NUL_State(FILE *pfread, FILE *pfwrite)
{
first = fgetc(pfread);
switch (first)
{
case '/':
second = fgetc(pfread);
if (second == '*')
{
// fputc('\n', pfwrite);
fputc('/', pfwrite);
fputc('/', pfwrite);
state = C_STATE;
}
else if (second == '/')
{
fputc(first, pfwrite);
fputc(second, pfwrite);
state = CPP_STATE;
}
else
{
fputc(first, pfwrite);
fputc(second, pfwrite);
}
break;
case '\n': //C注释中的多行注释
fputc('\n', pfwrite);
break;
case EOF: //文件结束标志
state = END_STATE;
break;
default: //不是注释的字符
fputc(first, pfwrite);
break;
}
}
{
first = fgetc(pfread);
switch (first)
{
case '/':
second = fgetc(pfread);
if (second == '*')
{
// fputc('\n', pfwrite);
fputc('/', pfwrite);
fputc('/', pfwrite);
state = C_STATE;
}
else if (second == '/')
{
fputc(first, pfwrite);
fputc(second, pfwrite);
state = CPP_STATE;
}
else
{
fputc(first, pfwrite);
fputc(second, pfwrite);
}
break;
case '\n': //C注释中的多行注释
fputc('\n', pfwrite);
break;
case EOF: //文件结束标志
state = END_STATE;
break;
default: //不是注释的字符
fputc(first, pfwrite);
break;
}
}
void Do_C_State(FILE *pfread, FILE *pfwrite)
{
first = fgetc(pfread);
switch (first)
{
case '*':
second = fgetc(pfread);
switch (second)
{
case '/': //连续的注释问题/**//**/
third = fgetc(pfread);
if (third == '/')
{
ungetc(third, pfread);
state = NUL_STATE;
break;
}
state = NUL_STATE;
if (third != '\n')
{
fputc('\n', pfwrite);
}
fputc(third, pfwrite);
break;
case '*': // 连续的**/问题
third = fgetc(pfread);
fputc(first, pfwrite);
if (third == '/')
{
state = NUL_STATE;
}
break;
default: //不是注释的字符
fputc(first, pfwrite);
fputc(second, pfwrite);
break;
}
break;
case '\n': //C注释中的多行注释
fputc('\n', pfwrite);
fputc('/', pfwrite);
fputc('/', pfwrite);
break;
case EOF: //文件结束标志
state = END_STATE;
break;
default: //不是注释的字符
fputc(first, pfwrite);
break;
}
}
{
fputc('\n', pfwrite);
}
fputc(third, pfwrite);
break;
case '*': // 连续的**/问题
third = fgetc(pfread);
fputc(first, pfwrite);
if (third == '/')
{
state = NUL_STATE;
}
break;
default: //不是注释的字符
fputc(first, pfwrite);
fputc(second, pfwrite);
break;
}
break;
case '\n': //C注释中的多行注释
fputc('\n', pfwrite);
fputc('/', pfwrite);
fputc('/', pfwrite);
break;
case EOF: //文件结束标志
state = END_STATE;
break;
default: //不是注释的字符
fputc(first, pfwrite);
break;
}
}
void Do_CPP_STATE(FILE *pfread, FILE *pfwrite)
{
first = fgetc(pfread);
switch (first)
{
case '\n':
fputc(first, pfwrite);
state = NUL_STATE;
break;
case EOF:
fputc(first, pfwrite);
state = END_STATE;
break;
default:
fputc(first, pfwrite);
break;
}
}
{
first = fgetc(pfread);
switch (first)
{
case '\n':
fputc(first, pfwrite);
state = NUL_STATE;
break;
case EOF:
fputc(first, pfwrite);
state = END_STATE;
break;
default:
fputc(first, pfwrite);
break;
}
}
void CommentConvert(FILE *pfread, FILE *pfwrite)
{
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
Do_NUL_State(pfread, pfwrite); //空状态
break;
case C_STATE:
Do_C_State(pfread, pfwrite); //C注释状态
break;
case CPP_STATE:
Do_CPP_STATE(pfread, pfwrite); //C++状态
case END_STATE:
break;
default:
break;
}
}
}
{
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
Do_NUL_State(pfread, pfwrite); //空状态
break;
case C_STATE:
Do_C_State(pfread, pfwrite); //C注释状态
break;
case CPP_STATE:
Do_CPP_STATE(pfread, pfwrite); //C++状态
case END_STATE:
break;
default:
break;
}
}
}
主函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
int main()
{
FILE *pfread = NULL;
FILE *pfwrite = NULL;
printf("转换开始!\n");
{
FILE *pfread = NULL;
FILE *pfwrite = NULL;
printf("转换开始!\n");
pfread = fopen(INPUTFILENAME, "r");
if (NULL == pfread)
{
perror("open file for read\n");
exit(EXIT_FAILURE);
}
pfwrite = fopen(OUTPUTFILENAME, "w");
if (NULL == pfwrite)
{
fclose(pfread);
perror("open file for write\n");
exit(EXIT_FAILURE);
}
CommentConvert(pfread, pfwrite);
if (NULL == pfread)
{
perror("open file for read\n");
exit(EXIT_FAILURE);
}
pfwrite = fopen(OUTPUTFILENAME, "w");
if (NULL == pfwrite)
{
fclose(pfread);
perror("open file for write\n");
exit(EXIT_FAILURE);
}
CommentConvert(pfread, pfwrite);
fclose(pfread);
fclose(pfwrite);
fclose(pfwrite);
printf("转换结束!\n");
system("pause");
return 0;
}
system("pause");
return 0;
}