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

li100700 2011-12-16 01:30:50


#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;
}






有缺陷啊 像这样的会重复统计怎么办??



/*aaaaaa
aaaaa// 这个重复
aaaaa// 这个重复
aaa//aa 这个重复
*/



/*
a= "//sssss\* "; 重复计一次
*/



void /*/*/ 算成了2行注释=.=



我目前统计方式是 只考虑“作为注释行处理”就是代码后有注释的按注释计!

请大家看看 怎么会是呢
...全文
169 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 forestdb 的回复:]
搞个状态机。

举个最简单的例子:/**/注释,不考虑其他的C语法。
假定一开始是非注释状态,读入一个字符,如果不是/,保持非注释状态继续读入字符,
如果字符是/,读入下一个字符,如果不是*,保持非注释状态,如果是*,进入注释状态;
在注释状态,类似的读入字符,如果不是*,保持注释状态继续读入字符,
如果字符是*,读入下一个字符,如果不是/,保持注释状态,如果是/,退出注释状态进入非字……
[/Quote]
支持。
《编译原理》词法分析 有限状态自动机
另外提醒:
还用一种注释
#if 0
这里是注释
#endif
ForestDB 2011-12-16
  • 打赏
  • 举报
回复
搞个状态机。

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

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

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧