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

[ 新手练习 4 ] 批处理计算字符串长度

假定一字符串 “123ABC上中下”,计算出这个字符串的长度,即有几个字符。

目的:掌握变量截取与条件判断用法。

要求:让批处理自动计算出字符串的长度。字符串可自定义,暂不考虑特殊字符。

评分:代码可读性 1 分;
   首个新方法 6 分,第二个 5 分,依次类推,最少 2 分;
   一人可多种方法,新方法追加 3 分,已经出现过的方法追加 1 分。

@echo off&setlocal enabledelayedexpansion
set /p var=请输入需要判断的字符串:

:agin
set var=!var:~0,-1!
set /a n+=1
if not "!var!"=="" goto :agin

echo 字符串长度:!n!
pause>nul

TOP

@echo off
set /p input=请输入需要检测的字符串:
set var=%input%
:sc_start
set var=%var:~0,-1%
set /a n+=1
if not "%var%"==""  (goto sc_start)
echo 字符串长度是%n%
pause>nul&exit

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::%1  字符串
  4. set str=%1
  5. set strLen=0
  6. :StartLoop
  7. if  "%str%"==""  goto EndLoop
  8. set str=!str:~1!
  9. set /a strLen+=1
  10. goto StartLoop
  11. :EndLoop
  12. echo %1 length is !strLen!
复制代码

TOP

回复 28# 老刘1号
255个已经够用了。再长的批处理自己也能计算。

TOP

回复 27# happy886rr


    感谢鼓励,
新版本出炉,峰值达到255个
用法: Batname <String>
继续学习汇编~~
  1. @Echo off
  2. IF /i "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" (
  3. echo DEBUG和8086_ASM不支持64位的系统。
  4. Pause&Exit
  5. )
  6. Set "Str=%*"
  7. >%tmp%\DEBUGASM.TMP (
  8. ECHO A20:0
  9. ECHO DB "%Str:~,70%"
  10. ECHO DB "%Str:~70,70%"
  11. ECHO DB "%Str:~140,70%"
  12. ECHO DB "%Str:~210,45%"
  13. ECHO DB 0
  14. ECHO.
  15. MORE +20 "%~0"
  16. )
  17. For /f "Tokens=2" %%a in (
  18. '^<%tmp%\DEBUGASM.TMP DEBUG^|Findstr /c:"0020:0000"'
  19. ) Do Set /a Strlen=0x%%a 2>nul
  20. Echo %Strlen%&DEL /F %tmp%\DEBUGASM.TMP&Exit /b
  21. A100
  22. MOV BX,20 ;一段安全的空间
  23. MOV DS,BX
  24. SUB BX,BX ;清空BX
  25. MOV CL,[BX] ;获取Ascii
  26. JCXZ 10E ;判断是否为NUL并跳出
  27. INC BX ;计数
  28. JMP 107 ;循环读取
  29. MOV [0],BX ;将字符串长度写入内存
  30. INT 21H
  31. G
  32. D20:0 0
  33. Q
  34. 老刘制作~
复制代码
1

评分人数

TOP

回复 26# 老刘1号
很棒,71个够用了,一般太长的都直接C语言解决。

TOP

回复 25# happy886rr


    峰值为71个
DEBUG一行就那么长...

TOP

回复 24# 老刘1号
超过65个字符就不行。

TOP

本帖最后由 老刘1号 于 2017-5-14 14:57 编辑

8086ASM(DEBUG版)
  1. Echo off&CLS
  2. IF /i "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" (
  3. echo DEBUG和8086_ASM不支持64位的系统。
  4. Pause&Exit
  5. )
  6. >"%Tmp%\DEBUGASM.TMP" (
  7. Echo A
  8. Echo MOV BX,20 ;一段安全的空间
  9. Echo MOV SS,BX
  10. Echo MOV SP,80 ;清理安全空间
  11. Echo MOV CX,40 ;循环次数(HEX)=清理字节数(128B)/入栈大小(2B)
  12. Echo SUB BX,BX ;清空BX
  13. Echo PUSH BX ;执行入栈(清理)
  14. Echo LOOP 10D ;循环压栈
  15. Echo SUB CX,CX ;清空CX
  16. Echo INT 21H
  17. Echo.&Echo G)
  18. Set /P str=Input a string:
  19. Echo E20:0 "%STR%">>"%Tmp%\DEBUGASM.TMP"
  20. More +25 "%~0" >>"%Tmp%\DEBUGASM.TMP"
  21. For /f "Tokens=2" %%a in (
  22. '^<%tmp%\DEBUGASM.TMP DEBUG^|Findstr /c:"0020:0000"'
  23. ) Do Set /a Strlen=0x%%a
  24. DEL %tmp%\DEBUGASM.TMP
  25. Echo %Strlen%&Pause&Exit /b
  26. A100
  27. MOV BX,20 ;一段安全的空间
  28. MOV DS,BX
  29. SUB BX,BX ;清空BX
  30. MOV CL,[BX] ;获取Ascii
  31. JCXZ 10E ;判断是否为NUL并跳出
  32. INC BX ;计数
  33. JMP 107 ;循环读取
  34. MOV [0],BX ;将字符串长度写入内存
  35. INT 21H
  36. G
  37. D20:0 0
  38. Q
  39. Q
复制代码
1

评分人数

TOP

参变量的最少个数为1,最少循环次数也为1,思路清晰了,也挺好写的

TOP

回复 21# taofan712

最好标明出处,方便看到的朋友系统学习。如果是你没记出处,就是你的问题了。
http://www.bathome.net/thread-11799-1-1.html
结合帖子中设置为一个变量调用的思路,也试着把这种方式写成一行试试
  1. @echo off & setlocal enabledelayedexpansion
  2. set "_strlen=set $=#^!$^!&set ##=&for /l %%a in (12,-1,0)do set/a"##^|^=1^<^<%%a"&for %%b in (^!##^!)do if ^!$:~%%b^!.==. set /a"##^&^=~1^<^<%%a""
  3. for %%i in (
  4. 12345678901234567890123456789012345678901234567890
  5. 1234567890123456789012345678901234567890
  6. 123456789012345678901234567890
  7. 12345678901234567890
  8. 1234567890
  9. 1
  10. ) do (
  11. set "$=%%i" & (%_strlen%)
  12. echo;!##! : %%i
  13. )
  14. pause & exit /b
复制代码
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

本帖最后由 taofan712 于 2017-3-10 16:26 编辑
  1. @echo off
  2. set "var=qwertyuioplkjhgfdsazxcvbnm"
  3. call :strLen var long
  4. echo;%long%
  5. pause&exit /b
  6. :strLen
  7. (   SETLOCAL ENABLEDELAYEDEXPANSION
  8.     set "str=A!%~1!"
  9.     set "len=0"
  10.     for /L %%A in (12,-1,0) do (
  11.         set /a "len|=1<<%%A"
  12.         for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"
  13.     )
  14. )
  15. ( ENDLOCAL
  16.     IF "%~2" NEQ "" SET /a %~2=%len%
  17. )
  18. goto :eof
复制代码
很偏门,但很好用,不忍独享,文件出处http://www.it1352.com/328587.html

TOP

  1. @echo off
  2. set str=123ABC上中下
  3. :loop
  4. set /a a+=1
  5. set str=%str:~0,-1%
  6. if "%str%"=="" (echo %a%&pause>nul ) else goto loop
复制代码

TOP

回复 12# batman
  1. @echo off
  2. set n=12345689
  3. set n=%n%;
  4. for /f "tokens=1 delims=:" %%1 in ('^(echo %n:;=^&echo.%^)^|findstr  /o ".*"')do set /a c=%%1-3
  5. echo %c%
  6. pause
复制代码
不用临时文件

TOP

返回列表