您的位置:首页 > 编程语言 > C语言/C++

C语言注释转化为C++注释(C语言实现)

2017-07-29 23:09 591 查看
/* int a=0;*/是C语言注释风格,而我们都知道C语言这样的注释是有缺陷的(不能嵌套注释),为了弥补这一缺陷,可将C语言注释风格改为C++注释风格(//int a=0;).本文就来讲一下怎么运用C语言实现C注释转化为C++注释。

在一段代码中,往往会出现很多种情况,先来讨论一下可能存在的情况。

看图:(NUL代表正常情况,END代表结束)



请看具体代码:

头文件及函数声明(ComentConvert.h)部分

#define _CRT_SECURE_NO_WARNINGS
#ifndef __COMMENT_CONVER_H__
#define __COMMENT_CONVER_H__

#include <stdio.h>
#include <stdlib.h>

enum STATE
{
END_STATE,
NUL_STATE,
C_STATE,
CPP_STATE
};

void DoNulState(FILE* pfIn, FILE* pfOut, enum STATE *s);//处理正常情况
void DoCState(FILE* pfIn, FILE* pfOut, enum STATE *s);//处理C语言注释部分
void DoCPPState(FILE* pfIn, FILE* pfOut, enum STATE *s);//处理C++注释部分

#endif//__COMMENT_CONVER_H__

具体函数实现ConmentConvert.c部分

#define _CRT_SECURE_NO_WARNINGS
#include "ComentConvert.h"

void DoNulState(FILE* pfIn, FILE* pfOut, enum STATE *s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '/':
{
int second = 0;
second = fgetc(pfIn);
switch (second)
{
case '/':
fputc(first, pfOut);
fputc(second, pfOut);
*s = CPP_STATE;
break;
case '*':
fputc(first, pfOut);
fputc(first, pfOut);
*s = C_STATE;
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case EOF:
*s = END_STATE;
break;
default:
fputc(first,pfOut);
break;
}
}
void DoCState(FILE* pfIn, FILE* pfOut, enum STATE *s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case '*':
{
int second = 0;
second = fgetc(pfIn);
switch (second)
{
case '*':
ungetc(second, pfIn);
fputc(second, pfOut);
break;
case '/':
fputc('\n', pfOut);
*s = NUL_STATE;
break;
default:
fputc(first, pfOut);
fputc(second, pfOut);
break;
}
}
break;
case '\n':
fputc(first, pfOut);
fputc('/', pfOut);
fputc('/', pfOut);
break;
default:
fputc(first, pfOut);
break;
}
}
void DoCPPState(FILE* pfIn, FILE* pfOut, enum STATE *s)
{
int first = 0;
first = fgetc(pfIn);
switch (first)
{
case EOF:
*s = END_STATE;
break;
default:
fputc(first, pfOut);
*s = NUL_STATE;
break;
}
}

#include "ComentConvert.h"

void test()
{
FILE* pfIn = NULL;
FILE* pfOut = NULL;
pfIn = fopen("input.c", "r");
if (pfIn == NULL)
{
perror("open a file for read");
exit(EXIT_FAILURE);
}
pfOut = fopen("output.c", "w");
if (pfOut == NULL)
{
perror("open a file for write");
fclose("input.c");
exit(EXIT_FAILURE);
}
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;
}
}
}

int main()
{
test();
return 0;
}

注释转换前后的对比:



PS:欢迎大家提出宝贵意见
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: