依然是源码注释行统计.请进来看看,感谢之至!
- C/C++ code
#include <string>#include <iostream>#include <fstream>using namespace std;int m_comment=0;int mm=0;int CountCommentLine( char* filename,int set) //注释行数{ int mm=0; ifstream inn(filename,ios::in); if(!inn) { cout << "can't" <<endl; return 1;//返回输入 } string line; bool flag = false; while(getline(inn,line)) { //找出第一个非空白字符 size_t begin = line.find_first_not_of(" \a\b\f\n\r\t\v"); //找出最后一个非空白字符 size_t end = line.find_last_not_of(" \a\b\f\n\r\t\v"); if (end - begin >0 ) { //不是C注释块 if(!flag) { //C++注释行 if (line[begin] == '/' && line[begin+1] == '/') m_comment++; /*C注释开始行*/ else if (line[begin] == '/' && line[begin+1] == '*') { m_comment++; /*有C风格注释块*/ if (!(line[end] == '/' && line[end -1] == '*')) flag = true; } } else { m_comment++; /* C风格注释块结束*/ if (line[end] == '/' && line[end -1] == '*') flag = false; } } /*该行只有一个字符,且在C风格注释块里面*/ else if (flag) { m_comment++; } } ifstream _inn(filename,ios::in); //这是为了统计代码后有注释的行数 string line2; bool flag2 = false; while(getline(_inn,line2)) { //找第一个非空白字符 size_t begin = line2.find_first_not_of(" \a\b\f\n\r\t\v"); //找最后一个非空白字符 size_t end = line2.find_last_not_of(" \a\b\f\n\r\t\v"); if (end - begin >0 ) { if(!flag) { for(int i=begin; i<end; ++i) { if(line2[begin]!='/'&&line2[begin+1]!='*'&&line2[begin+1]!='/') { if(line2[i]=='/'&&line2[i+1]=='/') { mm++; } if(line2[i]=='/'&&line2[i+1]=='*'&&line2[end-1]=='*'&&line2[end]=='/') { mm++; } } } } } } if(1==set)//代码后有注释 注释+ { m_comment = m_comment+mm; } if(0==set)//代码后有注释 注释不+ { ; } if(2==set) { //等待函数完成此三项//一个传值函数?输出调用这个函数? } return m_comment;}int main(void){ char filename[256]; int set; cin >>filename; cout <<"0: 只作为代码行处理" << endl <<"1: 只作注释行处理" << endl <<"2: 代码行和注释行各增加一行" <<endl; //单独写一个函数完成加减工作 cin >>set; int comment=CountCommentLine(filename,set); cout << "注释行数:" << comment <<endl; return 0;}有缺陷啊 像这样的会重复统计怎么办??
- C/C++ code
/*aaaaaaaaaaa// 这个重复aaaaa// 这个重复aaa//aa 这个重复*//* a= "//sssss\* "; 重复计一次*/ void /*/*/ 算成了2行注释=.=
我目前统计方式是 只考虑“作为注释行处理”就是代码后有注释的按注释计!
请大家看看 怎么会是呢
[解决办法]
搞个状态机。
举个最简单的例子:/**/注释,不考虑其他的C语法。
假定一开始是非注释状态,读入一个字符,如果不是/,保持非注释状态继续读入字符,
如果字符是/,读入下一个字符,如果不是*,保持非注释状态,如果是*,进入注释状态;
在注释状态,类似的读入字符,如果不是*,保持注释状态继续读入字符,
如果字符是*,读入下一个字符,如果不是/,保持注释状态,如果是/,退出注释状态进入非字符状态。
可以先把这个图画出来,然后对着图写程序。
[解决办法]