m0_46602893 2021-04-14 00:35 采纳率: 91.5%
浏览 19
已采纳

js问题,对乱码中的英文单词进行计数?

alert(countOfWorld("world,8thanks*0you>like0000)))what"))
            function countOfWorld(str){
                  var count = 0;
                  for(i = 0; i < str.length - 1; i++){
                        if(isABC(str[i]) && !isABC(str[i + 1])){
                              count++;
                        }
                  }
                  return count;
            }


            function isABC(scc){
                  if(scc >= "a" && scc <= "z" || scc >= "A" & scc <= "Z"){
                        return true;
                  }else
                        return false;
            }

这串代码的逻辑是第一个字母是单词,第二个字母不是单词,但是最后一个单词后面没有非字母了,所以无法判断,所以怎样优化代码可以把最后一个单词也数进去?

  • 写回答

4条回答 默认 最新

  • Menkongkong 2021-04-14 14:24
    关注

    如果你只是单纯的想要得到英文字符串的个数的话,只要将for循环中str.length - 1改为str.length就好。

    在你的源码中通过isABC(str[i]) && !isABC(str[i + 1])和scc >= "a" && scc <= "z" || scc >= "A" & scc <= "Z"去判断当前字符和下一个字符是否为字母,如果当前字符为字母而下一个字符不是字母,则表示一个单词,实现count++。

    但是因为你的循环遍历区间为0-str.length - 1,那么就说明你的当前字符串只可以遍历到what里的a就停止了,导致无法完全将字符串完全遍历,当遍历到a时你会判定a是一个字母,后面str[i + 1]会遍历到t,同样t也是一个字母,那么你的siABC函数会在a和t都返回true,isABC(str[i]) && !isABC(str[i + 1])后者加了!(非)变成了true&&false,count++无法执行,最后等于4。

    当将循环区间改为0-str.length时,最后一个遍历的字母是t,在执行str[i + 1]你是得不到任何字符的,因为你的字符串已经遍历完了,那么isABC(str[i + 1]实际上就传了一个undefined过去,最后返回一个false,执行isABC(str[i]) && !isABC(str[i + 1])是就变成了true&&!false也就是true&&true,count++会执行,最终count为5.

    这样的方式虽然可以可以得到最后的答案,但是明显存在bug,因为出现了undefined。

    更好的方式为用正则表达式去解决,获取字符串中的单词。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥88 实在没有想法,需要个思路
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)