C注释风格:/* */
C++注释风格: //
主要便是
CommentConvert .h
#ifndef __COMMENT_H__
#define __COMMENT_H__
#include<stdio.h>
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void DoCState(FILE*pfIn, FILE* pfOut);
void DoCppState(FILE* pfIn, FILE* pfOut);
void DoNulState(FILE* pfIn, FILE* pfOut);
void DoConvertWork(FILE* pfIn, FILE* pfOut);
#endif //__COMMENT_H__
CommentConvert .c
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConvert.h"
static enum STATE state = NUL_STATE;
void DoNulState(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
int second = 0;
switch (first)
{
case '/':
second = fgetc(pfIn);
if (second == '/') //C++注释
{
fputc(first, pfOut);
fputc(second, pfOut);
state = CPP_STATE;
}
else if (second == '*') //C注释
{
fputc('/', pfOut);
fputc('/', pfOut);
state = C_STATE;
}
else
{
fputc(first, pfOut);
fputc(second, pfOut);
}
break;
case EOF: //文件结束
state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCState(FILE*pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
int second = 0;
int third = 0;
switch (first)
{
case '*':
second = fgetc(pfIn);
switch (second)
{
case '/': //C注释结束
third = fgetc(pfIn);
if (third != '\n') //如果后面没有换行符,则加一个换行符
{
fputc('\n', pfOut);
}
if (third == '/')
{
ungetc(third, pfIn);
//字符返回函数:将读出的数据再次放回到缓冲区去,下一次读数据时,仍然读出来。
state = NUL_STATE;
break;
//连续注释问题 /* *//* */
}
fputc(third, pfOut);
state = NUL_STATE;
break;
case '*':
fputc(first, pfOut);
third = fgetc(pfIn);
if (third == '/')
{
state = NUL_STATE;
}
break;
default:
fputc(first, pfOut);
}
break;
case '\n':
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
break;
case EOF:
state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCppState(FILE* pfIn, FILE* pfOut)
{
int first = fgetc(pfIn);
switch (first)
{
case '\n':
fputc(first, pfOut);
state = NUL_STATE;
break;
case EOF:
state = END_STATE;
break;
default:
fputc(first, pfOut);
break;
}
}
void DoConvertWork(FILE* pfIn, FILE* pfOut)
{
while (state != END_STATE)
{
switch (state)
{
case C_STATE:
DoCState(pfIn, pfOut);
break;
case CPP_STATE:
DoCppState(pfIn, pfOut);
break;
case NUL_STATE:
DoNulState(pfIn, pfOut);
break;
default:
break;
}
}
}
test .c
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConvert.h"
int main()
{
FILE *fRead = NULL;
FILE *fWrite = NULL;
printf("注释转换开始\n");
fRead = fopen("input.c", "r");
if (fRead == NULL)
{
perror("open file for read");
}
fWrite = fopen("output.c", "w");
if (fWrite == NULL)
{
fclose(fRead);
perror("open file for write");
}
DoConvertWork(fRead, fWrite);
fclose(fRead);
fclose(fWrite);
printf("注释转换结束\n");
return 0;
}