【C语言】实现注释转换(c->c++)
2017-07-29 20:55
405 查看
由上图可知:C语言注释转换主要分为四个状态:Nul_STATE(空状态)、C_STATE(C注释状态)、Cpp_STATE(C++注释状态)和End_STATE(结束状态);
重要的是要分清每个状态结束的条件以及各个状态相互转换的边界条件,然后对其作具体情况的分析处理;所以我用了三个函数DoNulcomment()、DoCcomment()和DoCppcomment()进行注释转换;为了思路更加清晰,在程序实现的时候用了三个文件函数,具体代码如下:
CommentConvert.h
#ifndef __CommentConvert_H__
#define __CommentConvert_H__
#include<stdio.h>
#include<stdlib.h>
typedef enum STATE//状态
{
End_STATE,
Nul_STATE,
C_STATE,
Cpp_STATE,
}STATE;
void ConvertWork(FILE*pfIn, FILE*pfOut);//工作函数
void DoNulcomment(FILE *pfIn, FILE *pfOut, STATE*s);//无状态函数处理
void DoCcomment(FILE *pfIn, FILE *pfOut, STATE*s);//c注释部分处理
void DoCppcomment(FILE *pfIn, FILE *pfOut, STATE*s);//cpp注释状态处理
#endifCommentConvert.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"CommentConvert.h" void ConvertWork(FILE*pfIn, FILE*pfOut) { STATE state = Nul_STATE; while (state!=End_STATE) { switch (state) { case Nul_STATE: DoNulcomment(pfIn,pfOut,&state); break; case C_STATE: DoCcomment(pfIn, pfOut, &state); break; case Cpp_STATE: DoCppcomment(pfIn, pfOut, &state); break; } } } void DoNulcomment(FILE *pfIn, FILE *pfOut,STATE*s) { int first = 0; first = fgetc(pfIn); switch (first) { case'/': { int second = 0; second = fgetc(pfIn); switch (second) { case'/'://cpp状态 { fputc(first, pfOut); fputc(second, pfOut); *s = Cpp_STATE; } break; case'*'://c状态 { fputc(first, pfOut); fputc('/', pfOut); *s = C_STATE; } break; default: fputc(first, pfOut); fputc(second, pfOut); break; } } break; case EOF: fputc(first, pfOut); *s = End_STATE; break; default: fputc(first, pfOut); break; } } void DoCcomment(FILE *pfIn, FILE *pfOut, STATE*s) { int first = 0; first = fgetc(pfIn); switch (first) { case '*': { int second = 0; second = fgetc(pfIn); switch (second) { case'/': { int third = fgetc(pfIn); if (third == '\n') { *s = Nul_STATE; fputc(third, pfOut); } else { fputc('\n', pfOut); ungetc(third, pfIn); // fputc(third, pfOut); *s = Nul_STATE; } break; } case'*': ungetc('*', pfIn); fputc(first, pfOut); break; default: fputc(first, pfOut); fputc(second, pfOut); break; } } break; case'/': { int second = 0; second = fgetc(pfIn); switch (second) { case'/': { fputc(first, pfOut); fputc(second, pfOut); *s = Cpp_STATE; } break; default: fputc(first, pfOut); fputc(second, pfOut); break; } } break; case '\n': { int third = fgetc(pfIn); fputc(first, pfOut); if (third == '*') { ungetc('*', pfIn); } else { fputc('/', pfOut); fputc('/', pfOut); } break; } default: fputc(first, pfOut); break; } } void DoCppcomment(FILE *pfIn, FILE *pfOut, 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; default: fputc(first, pfOut); fputc(second, pfOut); break; } } break; case'*': { int second = 0; second = fgetc(pfIn); switch (second) { case'/': { fputc(first, pfOut); fputc(second, pfOut); //fputc('\n', pfOut); *s = Nul_STATE; break; } case'*': { ungetc('*', pfIn); fputc(first, pfOut); break; } default: fputc(first, pfOut); fputc(second, pfOut); break; } } break; case '\n': *s = Nul_STATE; fputc(first, pfOut); break; case EOF: *s = End_STATE; break; default: fputc(first, pfOut); break; } }test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"CommentConvert.h"
void test()
{
FILE *pfIn = NULL;
FILE *pfOut = NULL;
pfIn = fopen("input.c", "r");
pfOut = fopen("pfout.c", "w");
if (pfIn == NULL)
{
perror("file for fopen");
exit(EXIT_FAILURE);
}
if (pfOut == NULL)
{
perror("fopen");
fclose(pfIn);
exit(EXIT_FAILURE);
}
ConvertWork(pfIn, pfOut);
fclose(pfIn);
fclose(pfOut);
}
int main()
{
test();
system("pause");
return 0;
}结果展示:
相关文章推荐
- 【C语言】注释转换(C语言->C++)
- 使用C#.NET来实现 XML+XSL=>HTML的转换
- 注释转换(c语言->c++)
- 问题1:java中没有实现这种“byte a = 0xB2 --> String b = “B2””转换的简单实现需要自己实现。 答:自己编写的转换函数,思路将byte的高低4位分开,分别转换为对应的字符然后合成返回的字符串。 java 代码 1.
- List<> 转换为Dataset的C#代码实现 解决Nullable问题
- 用char*实现的一个完整的类,包含类的基本操作:一般构造、拷贝构造、赋值转换、重载 > >,< <
- 实现C++注释转换为标准C语言注释
- <二叉树 前中后 层序 非递归遍历 c语言实现>
- 用Javascript与WScript实现PPT->HTM在线转换,压缩并上传
- 用C语言实现 C到C++的注释转换
- 将浮点数表示的币值转换为人民币大写格式<Java实现>
- 【C语言】注释转换项目实现
- 关于OpenCV中利用函数cvConvert实现图像数据类型转换(8U->16S)
- 利用OpenOffice.org和Swftools进行实现—doc-->pdf-->swf--格式的转换
- 实现c语言注释转换为c++注释
- 汇编-&gt;十进制到二进制书转换的程序实现
- 用char*实现的一个完整的类,包含类的基本操作:一般构造、拷贝构造、赋值转换、重载 > >,< <
- c语言实现注释转换(c转为c++)
- 红黑树<C语言实现>
- 汇编-&gt;十进制到十六进制数转换的程序实现