去掉C/C++源程序中的注释
来源:互联网 发布:正装 知乎 编辑:程序博客网 时间:2024/05/27 12:21
对原文http://www.cnblogs.com/yangyangye/articles/1771823.html中的程序修改了两个地方,可以去掉 形如“//三角形面积”这样的汉字注释
原文内容为:
一道题目,输入是一个正确的C/C++源程序,输出是将所有注释去掉之后的程序。不细想觉得很简单,字符串搜索,找到//后再找一个回车,删掉,找到/*后再找一个*/,删掉,还有什么好做的,太简单了。
给个测试例子:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
cout<<"line 1 // hello"<<endl; // line 1
cout<<"line 2 /* haha~ */"<<endl; // line 2
cout<<"line 3 \" /* hehe */"<<endl; /* line 3 */
/* ********\\\\\\\\\\/////////********
this is test program
this is test program
this is test program
*/
return 0;
}
这是正确的C++程序,它的输出要是:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
cout<<"line 1 // hello"<<endl;
cout<<"line 2 /* haha~ */"<<endl;
cout<<"line 3 \" /* hehe */"<<endl;
return 0;
}
哇,这么一来想想就觉得复杂,字符串,先要找到字符串,字符串里的不算,字符串里还有转义符。。。
用状态机做会不会很方便,输入集中比较特殊的就这几个:/,*,",\,关键是在它的构造,在本子上画个表,纵向是表示状态,横向表示特殊的输入,表中的值就是状态的变化,再在旁边记录各个状态的含义,它大概是这样:
\输入 / * " \ 回车 其它
状态
1 0 5 0 0 0
...
: 正在分析
:读到第一个/
:读完第二个/,"//...
:读到 "/*...
:读到 "/*...*
:读到第一个"
:读到字符串里的转义符 "...\
:找到注释
和7是等价的状态,但是可以用7状态做些特别的事情,比如这个时候删除刚找到的注释等。最后的程序如下,输入输出还是用C的文件比较方便:
#include "stdio.h"
#include "string"
char fsm[8][128];
void initfsm()
{
const int line_len=sizeof(char)*128;
memset(fsm[0],0,line_len);
memset(fsm[1],0,line_len);
memset(fsm[2],2,line_len);
memset(fsm[3],3,line_len);
memset(fsm[4],3,line_len);
memset(fsm[5],5,line_len);
memset(fsm[6],5,line_len);
memset(fsm[7],0,line_len);
fsm[0]['/']=1;
fsm[0]['"']=5;
fsm[1]['/']=2;
fsm[1]['*']=3;
fsm[1]['"']=5;
fsm[2]['\n']=7;
fsm[3]['*']=4;
fsm[4]['/']=7;
fsm[4]['*']=4;
fsm[5]['"']=0;
fsm[5]['\\']=6;
fsm[7]['/']=1;
fsm[7]['"']=5;
}
int main()
{
int state=0;
char c;
std::string s;
FILE *fin=fopen("e:\\in.txt","r");
FILE *fout=fopen("e:\\out.txt","w");
initfsm();
while(fscanf(fin,"%c",&c)!=EOF)
{
state=fsm[state][c];
s+=c;
switch(state)
{
case 0:
fprintf(fout,"%s",s.c_str());
s="";
break;
case 7:
s="";
if(c=='\n')
{
fputc(c,fout);
}
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}
修改了
char fsm[8][128=>>]unsigned char fsm[8][256];
const int line_len=sizeof(char)*128=>>const int line_len=sizeof(char)*256;
char c=》unsigned char c;
- 去掉C/C++源程序中的注释
- 去掉C/C++源程序中的注释
- 源程序-删除c源文件中的注释
- 删除c/c++源程序中的注释
- 去掉c代码中的注释[转]
- 去掉C/C++程序代码中的注释
- 去掉C/C++程序代码中的注释
- 利用Shell脚本去掉C/C++源码中的注释
- 把C/C++程序代码中的注释去掉,并返回结果
- 编写程序将C / C++代码中的注释去掉
- 使用Python去除C/C++源程序中的所有注释和空行
- 去掉C语言中的注释(《C程序设计语言》习题1-23)
- C 语言状态机编程-去掉代码注释
- c语言中的注释
- 关于C中的注释
- 去除c中的注释
- 编写一个删除C语言源程序中的所有注释语句,要正确处理带引号的字符串和字符常量。
- JS:去掉Java代码中的注释(也适用于JS和C#)
- LSMW的流程及其注意事项
- 求一个字符串中连续出现次数最多的子串
- sharc 21489的sport学习笔记
- 妊娠期的营养胎儿教育
- Extraction of Entities and Relations调研
- 去掉C/C++源程序中的注释
- c++继承经典例子
- AES加解密算法Qt实现
- Android APK反编译详解
- sift算法研究_无匹配
- KD Tree
- 做ACM常用的C++头文件!
- 设计模式学习笔记 Chapter1
- 《神通乡巴佬》观后感 搞笑+感人