我试图创建一个可以计算字符串输入中所有字符的函数,但不计算任何注释(//或/ *)
到目前为止,它与//之后的行完美配合。我按每个新行拆分了我的字符串,如果它不包括//
我只计算字符串这是到目前为止的代码:
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);
}
正如我所提到的,它应该继续循环,直到它找到注释的结尾(* /)。到目前为止,这不起作用
非常感谢任何帮助! :)
答案 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));