[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[分享]批处理分段法计算字符串长度

受到拆半算法的启发,突然想到这种分段法。与大家分亨,不知道是否已有先例。
此方法无论是通用性和速度,都具有很大的优越性。
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=
  3. :rep
  4. :::::串长度计算代码:::::::::
  5. set/a end=8189,add=end
  6. :lp
  7. if %add%==1 goto :ok
  8. set /a ben=end-add,add=^(end-ben^)/30+1
  9. for /l %%a in (%ben%,%add%,%end%) do (if "!str:~%%a,1!"=="" set end=%%a&goto :lp)
  10. set end=0
  11. :ok
  12. :::::::::::::::::::::::::::::::
  13. ::测试用代码
  14. echo %end%
  15. set str=!str!a
  16. pause
  17. goto :rep
复制代码
1

评分人数

改了一下,减少了一次goto :lp循环,并且for /l 次数也从30降为21,速度有所提升
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=
  3. :rep
  4. set/a end=8189,add=end
  5. :lp
  6. if %add%==1 goto :ok
  7. set /a ben=end-add,add=^(end-ben+20^)/21
  8. for /l %%a in (%ben%,%add%,%end%) do (if "!str:~%%a,1!"=="" set end=%%a&goto :lp)
  9. set end=0
  10. :ok
  11. echo %end%
  12. set str=!str!a
  13. pause
  14. goto :rep
复制代码
二楼说的最简单的方法应该是这个吧:
str 为字符串变量
  1. if not defined str set num=0&goto :ok
  2. for /l %%a in (0,1,8189) do (if "!str:~%%a,1!"=="" set num=%%a&goto :ok)
  3. :ok
复制代码
此法并非不可用,只是效率一般,串越长越慢
虽然只有一个for ,并且for /l的速度很快,但是也需要时间的
因为在系统在解释for /l时已经分配了8189次if "!str...命令行

[ 本帖最后由 netbenton 于 2009-4-23 17:56 编辑 ]

TOP

又改了一下,把8189改成了8190,否则最后一段取不到结果
写成函数如下:
  1. :::::::::::::::::::::::::::::::::::::::::
  2. :getstrlen  分段法取字符串长度
  3. ::  用法用途:
  4. ::  把代码放到批处理中作为函数使用
  5. ::  取指定字答串的长度
  6. ::  调用方法:
  7. ::  call :getstrlen 字符串变量名 结果变量名
  8. ::::::::::::::::::::::::::::::::::::::::::
  9. setlocal enabledelayedexpansion
  10. set "str=!%1!"
  11. :rep
  12. set/a end=8190,add=end
  13. :lp
  14. if %add%==1 goto :ok
  15. set /a ben=end-add,add=^(end-ben+20^)/21
  16. for /l %%a in (%ben%,%add%,%end%) do (if "!str:~%%a,1!"=="" set end=%%a&goto :lp)
  17. set end=0
  18. :ok
  19. endlocal&set %2=%end%&goto :eof
复制代码

TOP

没有goto :lp也可以了

  1. @echo off&setlocal enabledelayedexpansion
  2. set str=
  3. :rep
  4. ::变量ds用来指定分段数,可随意指定(2到8190)都可以。
  5. set/a ds=4,ds1=ds-1
  6. if not defined str set end=-1&goto :ok
  7. set/a end=0,add=8190
  8. for /l %%a in (0,1,14) do (
  9. if !add!==1 goto :ok
  10. set /a end+=add,ben=end-add,add=^(end-ben+ds1^)/ds
  11. for /l %%b in (!ben!,!add!,!end!) do (if not "!str:~%%b,1!"=="" set end=%%b)
  12. )
  13. :ok
  14. set /a end+=1
  15. echo !end! !str!
  16. set str=!str!a
  17. pause
  18. goto :rep
复制代码

可以做到随意n分段,分为2段时,就像随风版主的拆半法了,到底分多少段才是最快速的呢?

TOP

返回列表