C语言的注释 /*C语言*/
C++的注释 //C++
本文写的注释转换是将C语言注释转换为C++注释
大概有这几种情况
//1.一般情况
/* int i = 0; */
//2.换行问题
/* int i = 0; */ int j = 0;
/* int i = 0; */
int j = 0;
//3.匹配问题
/* int i = 0; /*xxxxxxx*/
//4.多行注释问题
/*
int i = 0;
int j = 0;
int k = 0;
*/int k = 0;
//5.连续注释问题
/**/ /**/
//6.连续**/问题
/***/
//7.c++注释问题
// /*xxxxxxxx*/
主要的思想为
代码为:
CommentCovert.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _COMMENT_COVERT__H_
#define _COMMENT_COVERT__H_
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define INPUT_FILE "input.c"
#define OUTPUT_FILE "output.c"
typedef enum STATE
{
NUL_STATE,//无状态
C_STATE,//C状态
CPP_STATE,//C++状态
END_STATE//结束
}State;
void DoConverWork(FILE* pfRead,FILE* pfWrite);//转换工作
void DoNulState(FILE* pfRead, FILE* pfWrite);//空状态
void DoCState(FILE* pfRead, FILE* pfWrite);//C状态
void DoCppState(FILE* pfRead, FILE* pfWrite);//C++状态
void CommentConvert();
#endif//_COMMENT_COVERT__H_
CommentCovert.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentCovert.h"
State state = NUL_STATE;
void DoConverWork(FILE* pfRead, FILE* pfWrite)//转换工作
{
while (state != END_STATE)
{
switch (state)
{
case NUL_STATE:
DoNulState(pfRead, pfWrite);
break;
case C_STATE:
DoCState(pfRead, pfWrite);
break;
case CPP_STATE:
DoCppState(pfRead, pfWrite);
break;
case END_STATE:
break;
}
}
}
void DoNulState(FILE* pfRead, FILE* pfWrite)//无状态
{
char first = fgetc(pfRead);
char second;
switch (first)
{
case '/':
second = fgetc(pfRead);
if (second == '*')//遇到/*,写入//,转换为c状态
{
fputc(first, pfWrite);
fputc('/', pfWrite);
state = C_STATE;
}
else if (second == '/')//遇到//,写入//,转换为C++状态
{
fputc('/', pfWrite);
fputc('/', pfWrite);
state = CPP_STATE;
}
else//遇到其他,直接写入
{
fputc(first, pfWrite);
fputc(second, pfWrite);
}
break;
case EOF://遇到EOF,转换为结束状态
state = END_STATE;
break;
default:
fputc(first, pfWrite);
break;
}
}
void DoCState(FILE* pfRead, FILE* pfWrite)//c状态
{
char first = fgetc(pfRead);
char second;
switch (first)
{
case '*':
second = fgetc(pfRead);
if (second == '/')//遇到*/,c状态结束,转换为无状态
{
state = NUL_STATE;
char next = fgetc(pfRead);
if (next == '\n')//如果 * / 后面是\n,把\n放回去
{
ungetc(next, pfRead);
}
else//如果 * / 后面不是\n,写入\n,把读到的字符放回
{
fputc('\n', pfWrite);
ungetc(next, pfRead);
}
}
else
{
fputc(first, pfWrite);
ungetc(second, pfRead);
}
break;
case EOF:
state = END_STATE;
break;
case '\n':
fputc(first, pfWrite);
fputc('/', pfWrite);
fputc('/', pfWrite);
break;
default:
fputc(first, pfWrite);
break;
}
}
void DoCppState(FILE* pfRead, FILE* pfWrite)//C++状态
{
int first = fgetc(pfRead);
switch (first)
{
case '\n':
fputc(first, pfWrite);//遇到回车,则进入无状态
state = NUL_STATE;
break;
case EOF:
state = END_STATE;
break;
default:
fputc(first, pfWrite);
break;
}
}
void CommentConvert()
{
FILE* pfRead = NULL;
FILE* pfWrite = NULL;
pfRead = fopen(INPUT_FILE, "r");//打开文件,读
if (pfRead == NULL)
{
perror("open file for read\n");
exit(EXIT_FAILURE);
}
pfWrite = fopen(OUTPUT_FILE, "w");//打开文件写
if (pfWrite == NULL)
{
perror("open file for write\n");
fclose(pfRead);
exit(EXIT_FAILURE);
}
DoConverWork(pfRead, pfWrite);//转换工作
fclose(pfRead);
fclose(pfWrite);
}
Test.h
#define _CRT_SECURE_NO_WARNINGS 1
#include "CommentCovert.h"
int main()
{
CommentConvert();
system("pause");
return 0;
}