You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求修复:统计字符串中不含//与/*注释的字符数的JavaScript函数

修复多行注释字符统计问题的方案

我先帮你梳理下原代码里的几个核心问题:

  • countStars变量在if块内用var声明,导致作用域混乱,初始状态也没正确设置
  • 多行注释的处理逻辑顺序颠倒了,应该先检查是否处于多行注释中,再处理当前行的内容
  • 没有处理**同一行内同时存在/*和*/**的情况,也没考虑多行注释跨行的场景

下面是修复后的完整代码,我会逐点解释修改的地方:

function findComments() { 
  var string = document.getElementById("input").value; 
  var splittedString = string.split("\n"); 
  var count = 0; 
  var countStars = false; // 把状态变量提到函数开头,初始化false
  
  for (var i = 0; i < splittedString.length; i++) { 
    var currentLine = splittedString[i];
    var processedLine = currentLine;

    // 第一步:处理多行注释状态
    if (countStars) {
      // 寻找当前行的*/位置
      var endMultiCommentIndex = processedLine.indexOf("*/");
      if (endMultiCommentIndex > -1) {
        // 找到结束标记,只保留*/之后的内容
        processedLine = processedLine.slice(endMultiCommentIndex + 2);
        countStars = false;
      } else {
        // 没找到结束标记,整行跳过
        continue;
      }
    }

    // 第二步:检查当前行是否有新的多行注释开始
    var startMultiCommentIndex = processedLine.indexOf("/*");
    while (startMultiCommentIndex > -1) {
      // 先统计/*之前的字符
      count += processedLine.slice(0, startMultiCommentIndex).length;
      // 寻找当前段的*/位置
      var endMultiCommentIndex = processedLine.indexOf("*/", startMultiCommentIndex + 2);
      if (endMultiCommentIndex > -1) {
        // 找到结束标记,保留*/之后的内容继续处理
        processedLine = processedLine.slice(endMultiCommentIndex + 2);
        startMultiCommentIndex = processedLine.indexOf("/*");
      } else {
        // 没找到结束标记,进入多行注释状态,结束当前行处理
        countStars = true;
        processedLine = "";
        break;
      }
    }

    // 第三步:处理单行注释
    var singleCommentIndex = processedLine.indexOf("//");
    if (singleCommentIndex > -1) {
      processedLine = processedLine.slice(0, singleCommentIndex);
    }

    // 统计有效字符
    count += processedLine.length;
  } 
  console.log(count); 
}

关键修改说明:

  • 状态变量作用域修正:把countStars移到函数开头声明并初始化,确保在整个循环中状态是持续的,不会因为块级声明导致重置
  • 多行注释处理逻辑重构:
    • 先判断是否处于多行注释中,找到结束标记后才继续处理后续内容
    • 支持处理同一行内多个/*/*/的嵌套或连续情况(比如/* 注释1 */ 有效内容 /* 注释2 */)
  • 字符统计逻辑优化:不再直接统计整行,而是逐步截断注释部分,只统计有效内容的长度
  • 跨行多行注释支持:当遇到未闭合的/*时,标记状态为true,后续行都会跳过直到找到*/

这个版本可以正确处理:

  • 单行注释//之后的内容不统计
  • 多行注释/* ... */内的内容不统计,包括跨行的情况
  • 同一行内同时存在多行注释、单行注释和有效内容的混合场景

内容的提问来源于stack exchange,提问作者ITGuru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:11:52