自动检测代码的一个小工具...

lynn0821 2005-09-01 06:56:05
是这样的,上个礼拜在一个项目的同行评审中,在代码规范这一块当中,有个很小的问题、但也是比较严重的一个问题。新近的员工,我自己也是,以前没有编码经验,写代码时总是不能很好地达到代码规范所要求的那样,比如在每个运算符(如+,-,=,...)的左右两边都要留个空格...经常自己写好后都很自责,但自责过后呢,就赶紧一个个地改过去,心里不好受不说,那个累啊,简直比写文档还烦...最重要的是,给项目经理造成了不好的印象ing,所以,我写了一个小程序,用来自动检测**以上所说的不好习惯,并且自动修改...算是自己毕业以来第二大的一个小作为吧(之前还有一个大一点点的作为嘞,下篇文章说吧)...至于程序和代码嘛,我会与大家一起来完善的...没有用到什么匹配,几乎是c语言的翻版,语法分析嘛,也说不上...呵呵hoho ..对了,还可以整个文件夹检测...以下是部分代码...
高手们就不要拍我砖啦...给新人我一个鼓励啊~:)

for(int i = 0; i < arrLine.Length; i ++ )//追行遍历
{
if(arrLine[i].Trim().StartsWith("///") || arrLine[i].Trim().StartsWith("//") || arrLine[i].Trim().StartsWith("/*")) // 忽略以"///" , "//" , "/*"开头的行
{
continue;
}
else
{
for(int j = 0; j < arrLine[i].Length; j ++ )
{
if(iFlags == 0 //在引号外面
&& arrLine[i][j] == '/' && arrLine[i][j + 1] == '/')//同时当前指向/,下一个也是/的情况,就是到注释了...
{
break;//跳出该行,开始新一行的检测
}
if(arrLine[i][j] == ';' && (arrLine[i][j + 1] == '/' || arrLine[i][j + 1] == '\r'))//遇到“;”,且后面一个是//或者是\r(其实为\r\n,到换行位置)
{
break;//跳出该行,开始新一行的检测
}
if(arrLine[i][j] == '"' && arrLine[i][j - 1] != '\\')//遇到一个引号,同时它的前面一个不是"\"
{
iFlags++;//每遇到一个引号,iFlags就加一
}
if(arrLine[i][j] == '\'' && arrLine[i][j - 1] != '\\')//遇到一个单引号,同时它的前面一个不是"\"
{
iFlag++;//每遇到一个单引号,iFlag就加一
}

switch(iFlags)
{
case 0 ://引号外面
{
switch(iFlag)//有单引号的时候...
{
case 0 :
if(IsSignCode(arrLine[i][j])//belongs to ArrSign
&& j < arrLine[i].Length - 1)//and don't reach the last one
{
// arrContent[i] = "●" + arrContent[i];
arrLine[i] = HaveBlankAndChange(arrLine[i], ref j, i + 1);
}
break;
case 1://iFlag是1,在单引号内
continue;
case 2 ://第二个单引号
iFlag = 0;//将iFlag置0
break;
}
break;
}
case 1 ://iFlags是1,在引号内
continue;
case 2 ://第二个引号
iFlags = 0;//将iFlags置0
break;
}//switch
}//for
}//else
}//for

lErrCount.Text = iErrorCount + " 个";//显示错误个数

for(int l = 1; l<=listError.Count;l++)
{
lbError.Items.Add("[" + l + "]" + listError[l - 1]);
}



本文引用通告地址: http://blog.csdn.net/lynn0821/services/trackbacks/469672.aspx
[点击此处收藏本文]
...全文
215 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sskset 2005-09-20
  • 打赏
  • 举报
回复
mark 以后再看
kirc 2005-09-20
  • 打赏
  • 举报
回复
做成macro或者addin或许更好用一些噢...
如果你能提供macro版本,请给我一份.谢谢!!

最好还能带一些其它的东东.添加代码文件头的备注等等.

我有一个添加#region和自动格式化的addin.要的话也可以找我.
kirc(at)yeah.net
lynn0821 2005-09-20
  • 打赏
  • 举报
回复
恩,可能吧
当时考虑到细节太多了,所以并没有想到怎么优化
呵呵,谢谢楼上~

我也已经解决了“ string s=@"string a=""\"";"检测结果为:string s = @"string a=""\""; " ”这个问题,

解决方案如下:
if(arrLine[i][j] == '"')//遇到一个引号,同时它的前面一个不是"\"
{
if(arrLine[i][j - 1] != '\\')
{
iFlag++;//每遇到一个双引号,iFlag就加一
}
else if(iFlag == 1)
{
iFlag --;
}
}
就是,如果遇到“\”这个情况时,如果\的后面是引号,而且之前已经有一个引号了(这里就是iFlag==1),必须把iFlag--
可能还有别的问题,希望大家给给意见啊
totopig 2005-09-20
  • 打赏
  • 举报
回复
我觉得你跳过if语句写在一个方法里太多了,可以写个方法来过滤这些不需要检查的行。
这样看起来清晰性更高一些。

个人拙见。
lynn0821 2005-09-20
  • 打赏
  • 举报
回复
string s=@"string a=""\"";"
检测结果为:string s = @"string a=""\""; "
最后一个引号前多了个空格....
正在解决...
syeerzy 2005-09-05
  • 打赏
  • 举报
回复
回复: lynn0821(林子)
以@开头的字符串——这个想到了,@开头的字符串是在引号里吧,所以....
字符串中的\转义字符——这个也有的


问题想简单了,假设一个 @"string a=""\"";" (相当于"string a=\"\\\";")
你这个程序可就出问题了.

zhongwanli 2005-09-04
  • 打赏
  • 举报
回复
MARK
fanruinet 2005-09-04
  • 打赏
  • 举报
回复
没这么简单,以@开头的字符串中\不是转义字符,而且双引号是"",我看你没有单独处理
lynn0821 2005-09-04
  • 打赏
  • 举报
回复
行中间或末尾的/*注释——这倒是没有想到,呵呵,谢谢
以@开头的字符串——这个想到了,@开头的字符串是在引号里吧,所以....
字符串中的\转义字符——这个也有的
fanruinet 2005-09-02
  • 打赏
  • 举报
回复
还有些问题考虑全了吗?
比如行中间或末尾的/*注释
以@开头的字符串
字符串中的\转义字符
lynn0821 2005-09-02
  • 打赏
  • 举报
回复
这回应该有人来捧场了吧:)
lynn0821 2005-09-01
  • 打赏
  • 举报
回复
对了程序下载地址给我邮件里说吧,我没有空间上传
lynn0821 2005-09-01
  • 打赏
  • 举报
回复
要不我把做好的安装包提供下载吧,ok?
xjjdanran 2005-09-01
  • 打赏
  • 举报
回复
mark

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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