将C/C++代码中的注释删除
2012-04-09 16:03
429 查看
题目:
将C/C++代码中的注释通过程序删除。
分析:
C/C++中的代码注释,包括如下形式://, /* */。
当然,在""和''中的//, /* */是无效的,不应删除。
因此,可以考虑针对/, *, ", '加标志flag1, flag2, flag3, flag4:
1)遇到/时,读取下一个字符,如果是/时,则将当前行删除;如果是*,记录当前位置,找到*/,然后删除之间的字符;
2)遇到"或者'时,flag3, flag4置为true,在"或'中的注释忽略掉。
代码如下:
将C/C++代码中的注释通过程序删除。
分析:
C/C++中的代码注释,包括如下形式://, /* */。
当然,在""和''中的//, /* */是无效的,不应删除。
因此,可以考虑针对/, *, ", '加标志flag1, flag2, flag3, flag4:
1)遇到/时,读取下一个字符,如果是/时,则将当前行删除;如果是*,记录当前位置,找到*/,然后删除之间的字符;
2)遇到"或者'时,flag3, flag4置为true,在"或'中的注释忽略掉。
代码如下:
//============================================================================ // Name : DeleteComments.cpp // Author : // Version : // Copyright : All rights reserved // Description : 去掉C/C++程序中的注释 // 1. //... // 2. /*... */ // 3. 特殊情况: // (1) "//" "/*" 不算注释 // (2) ''中的//和/* // (3) 二者互相嵌套 //============================================================================ #include <iostream> #include <fstream> using namespace std; void deleteComments(char *, int); int main() { string filename; cout << "Please enter name for a cpp file:" << endl; cin >> filename; ifstream fin; try { fin.open(filename.c_str()); } catch(std::exception &e) { cout << e.what() << endl; } if (fin.is_open()) { cout << "Open " << filename << " successfully!" << endl; } char buf[102400]; int n = fin.readsome(buf, sizeof(buf));//read(buf, sizeof(buf)); if (n == -1) { fin.close(); } deleteComments(buf, n); cout << "After Dealing: " << endl << buf <<endl; return 0; } void deleteComments(char* buf, int n) { char *p, *end, c; p = buf; end = buf + n; char *pos1 = NULL, *pos2 = NULL; bool flag1 = false, flag2 = false;// " and ' int flag3 = 0, flag4 = 0, flag5 = 0;// for /*... //... */ while( p < end) { c = *p; cout << "new char: " << c <<endl; switch(c) { case '"': { if (flag3 == 0) flag1 = (flag1 == true)?false:true; p ++; } break; case '\'': { if (flag3 == 0) flag2 = (flag2 == true)?false:true; p ++; } break; case '/': { p ++; if (*p == '/' && (flag3 == 0)) // ..... //.... { p ++; cout << "in // " << endl; cout << " falg3: " << flag3 << " flag5: " << flag5 << " flag1: " << flag1 << " flag2: " << flag2 << endl; if (!flag1 && !flag2 && (flag5 == 0) && (flag4 == 0) && (flag3 == 0)) { //flag4 ++; // deal with //...:delete char until '\n' cout << "deal with // ..." << endl; *(p-1) = ' '; *(p-2) = ' '; while (*p != '\n') { cout << "dealing : " << *p << " "; *p = ' '; p ++; } } } else if ( *p == '*' && !flag1 && !flag2 && (flag3 == 0)) // .... /*..... { p ++; flag3 ++; cout << " falg3: " << flag3 << " flag5: " << flag5 << " flag1: " << flag1 << " flag2: " << flag2 << endl; if (!flag1 && !flag2 && (flag4 == 0) && (flag3 == 1)) { pos1 = p;// delete from pos1 } } }break; case '*': { p ++; if (*p == '/' && !flag1 && !flag2) // .... */... { flag5 ++; cout << " falg3: " << flag3 << " flag5: " << flag5 << " flag1: " << flag1 << " flag2: " << flag2 << endl; if(!flag1 && !flag2 && (flag3 != 0) && (flag5 != 0)) { flag3 = 0; flag5 --; pos2 = p - 2; cout << "deal with \/* .. *\/" << endl; // deal wtih /*... */... : delete from pos1 to pos2 char *pos = pos1; *(pos - 1) = ' '; *(pos - 2) = ' '; *(pos2 + 1) = ' '; *(pos2 + 2) = ' '; do { cout << "dealing: " << *pos << endl; *pos = ' '; pos ++; } while(pos != pos2 + 1); } } } break; default: p ++; break; } } }
相关文章推荐
- 删除C++代码注释的脚本
- Java 删除c/c++/java代码注释的代码片段
- 状态机编程思想(2):删除代码注释(目前支持C/C++和Java)
- 状态机编程思想(2):删除代码注释(目前支持C/C++和Java)
- 怎样删除C/C++代码中的所有注释?浅谈状态机的编程思想
- 将C/C++代码中的注释删除
- 怎样删除C/C++代码中的所有注释?浅谈状态机的编程思想
- 怎样删除C++代码中的注释——有限状态机思想的使用
- 去掉C/C++程序代码中的注释
- 链表的添加、查找删除、反向打印c++代码
- C++_Gluttonous_Snake_Plus_贪吃蛇加强版_代码详细注释
- 删除特定位置前面的字符串c++代码实例及运行结果
- 用js读、写、删除Cookie代码分享及详细注释说明
- vim C/C++注释代码
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- C++代码注释规范(整理)
- 删除Java代码中的注释
- 随机森林代码注释(C++版本)
- 第7周 C语言程序设计(新2版) 练习1-23 删除C语言程序中所有的注释语句(代码有问题?)
- 链表的添加、查找删除、反向打印c++代码