获取变量的长度(即:字符数)
目前常见的方法好像只有一种,那就是逐字判断,也就是一个一个的去数,
此种方法虽能实现但有两个最大的缺点
一、逐字判断,效率很低,速度取决于变量的长度,越长就越慢。
二、必须使用goto进行循环,若是对文本逐行进行判断时还必须用call先跳出for又一次影响效率
.
以下代码打破了此种常规,无论变量的字符数是多少,(1-8189)
for /L 都只需循环14次即可得到结果,且不用goto和call
原理很简单
首先我们知道变量的最多字符数为8192这其实是包括了变量名和等号及set后面的那个空格,所以变量的实际长度最多只允许有8189个。
首先判断变量是否为超过8189个,如果没有则把8189除以2再判断,再没有再除以2
如此经过几次循环就能得到变量字符数的上限和下限,也就是大大缩小了范围,再在此范围内重复前面的循环即可得到最终结果。
为考虑极端情况(字符数为8189个时)所以代码中变量名必须是单一字母,且不能加引号。
书写时注意别在后面误加空格。。。- @echo off&rem 判断变量长度 折半法
- ::@随风 @bbs.bathome.net @2009-04-18
- for /f "delims=" %%a in (a.txt) do (
- set s=%%a&set /a sun+=1
- setlocal enabledelayedexpansion&set "var="
- set /a n=8189*2,max=1
- for /l %%a in (1 1 14) do (
- if defined var set /a n=var
- set /a n/=2
- for %%i in (!n!) do (
- if "!s:~%%i,1!"=="" (set /a var=n) else (
- set s=!s:~%%i!&set /a max+=%%i,var-=%%i
- )))
- echo 第!sun! 行的字符数为: !max! 个
- endlocal
- )
- pause
复制代码 以下是函数封装- :loop 不能处理%号,变量字符数上限为8187个。
- ::@随风 @bbs.bathome.net @2009-04-18
- set "s=%~1"&rem 判断变量长度(封装)折半法
- setlocal enabledelayedexpansion
- set /a n=8189*2,max=1&set "var="
- for /l %%a in (1 1 14) do (
- if defined var set /a n=var
- set /a n/=2
- for %%i in (!n!) do (
- if "!s:~%%i,1!"=="" (set /a var=n) else (
- set s=!s:~%%i!&set /a max+=%%i,var-=%%i
- )))
- endlocal&set %~2=%max%&goto :EOF
复制代码
[ 本帖最后由 随风 于 2009-4-18 17:00 编辑 ] |