读书人

依然是源码注释行统计.请进来看看感

发布时间: 2012-02-13 17:20:26 作者: rapoo

依然是源码注释行统计.请进来看看,感谢之至!

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语法。
假定一开始是非注释状态,读入一个字符,如果不是/,保持非注释状态继续读入字符,


如果字符是/,读入下一个字符,如果不是*,保持非注释状态,如果是*,进入注释状态;
在注释状态,类似的读入字符,如果不是*,保持注释状态继续读入字符,
如果字符是*,读入下一个字符,如果不是/,保持注释状态,如果是/,退出注释状态进入非字符状态。

可以先把这个图画出来,然后对着图写程序。

[解决办法]

探讨
搞个状态机。

举个最简单的例子:/**/注释,不考虑其他的C语法。
假定一开始是非注释状态,读入一个字符,如果不是/,保持非注释状态继续读入字符,
如果字符是/,读入下一个字符,如果不是*,保持非注释状态,如果是*,进入注释状态;
在注释状态,类似的读入字符,如果不是*,保持注释状态继续读入字符,
如果字符是*,读入下一个字符,如果不是/,保持注释状态,如果是/,退出注释状态进入非字……

读书人网 >C++

热点推荐