计算没有评论的字符

时间:2018-01-04 10:49:53

标签: javascript if-statement while-loop comments

我试图创建一个可以计算字符串输入中所有字符的函数,但不计算任何注释(//或/ *)

到目前为止,它与//之后的行完美配合。我按每个新行拆分了我的字符串,如果它不包括//

我只计算字符串

这是到目前为止的代码:

function findComments() {

    var string = document.getElementById("input").value;
    var splittedString = string.split("\n");

    var count = 0;

    for (var i = 0; i < splittedString.length; i++) {
        while (countStars) {
            if(splittedString[i].indexOf("*/") > -1) {
                countStars = false;
            }
            continue;
        }

        if(splittedString[i].indexOf("/*") > -1) {
            var countStars = true;
        }

        if(splittedString[i].indexOf("//") === -1) {

            var chars = splittedString[i].split("");
            for (var j = 0; j < chars.length; j++) {
                count++;
            }
        }

    }
    console.log(count);
}

正如我所提到的,它应该继续循环,直到它找到注释的结尾(* /)。到目前为止,这不起作用

非常感谢任何帮助! :)

3 个答案:

答案 0 :(得分:1)

 var inComment = false, count = 0;
 for(const line of splittedStrings){
  var end = -1;
  if(inComment){
   end = line.indexOf("*/");
   if(end === -1){
     count += line.length;
     continue;
   } else {
     count += end;
     inComment = false;
   }
  }
  const single = line.indexOf("//", end);
  const multi = line.indexOf("/*", end);
  if(single + multi === -2) continue;
  if(multi !== -1 && multi < single){
    //got a multiline comment
    inComment = true;
    count += line.length - (multi + 2);
 } else{
   //got a single line comment
   count += line.length - (single + 2);
 }
}

如果你在多线注释中,请保留一个标志

答案 1 :(得分:1)

你应该在for循环之外声明countStars,因为你在声明之前就检查了那个变量了 你应该从while循环中获取continue语句。继续将再次点击while语句。

for(var i = 0; i<10; ++i)
{
    var j = 10;
    var k = true;
    while(j > 0 && k)
    {
       j--;
       if(j == 8)
       {k == false;}
    }
    if(!k)
       continue;
}

答案 2 :(得分:0)

这可以进一步改进,但您可以将原始文本拆分为&#39; / *&#39;并从您的计数中减去块注释的长度。这意味着不必要地计算块注释,但它可以完成工作。

像这样分割文本,你知道数组中的每个第二项都是你的块注释。

var blockComments = string.split('/*');

function blockCommentsLength(array){
   length = 0;
   for (var i = 0; i < array.length; i = i +2){
      length += array[i].length
   }

   return length;
}

...

console.log(count - blockCommentsLength(blockComments));