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

[文本处理] 【已解决】字符串截取判断的批处理出错找不到问题

本帖最后由 求知路漫漫 于 2022-3-9 18:05 编辑

目的:对1和0组成的字符串,从左往右,如果出现0之后,不能出现1,测试通过,否则测试失败。想了两个方案,都总出问题,又解决不了,谢谢执教。
方案一。从左第一个起,一个一个截取,若出现数字0,将剩下的转换成数字,如果为0则成功,否则失败。代码如下:
  1. set /p str=请输入32位由0,1组成的字符串
  2. setlocal enabledelayedexpansion
  3. for /L %%i in (0,1,31) do (
  4. ::逐次截取第一位
  5. set /a aa=!!str:~%%i,1!!
  6. if !aa! equ 0 (
  7. ::需要将剩余的字符串转换位十进制,否则数值超限
  8. call :2x10 %%str:~!i!%% cc
  9. if !cc! ==0 (goto :test1) else goto :test2
  10.             )
  11.                            )
  12. endlocal
  13. echo 出现这个说明程序出错了,请检查代码!
  14. pause
  15. ::借用十进制转二进制函数
  16. :2x10  2进制转 10进制 @随风 @bbs.bathome.net (封装)
  17. @echo off&setlocal enabledelayedexpansion
  18. set /a nnn=1,num=0&set nn=&set "n=%~1"
  19. set "n=!n:0= 0!"&set "n=!n:1= 1!"
  20. for %%a in (!n!) do set "nn=%%a !nn!"
  21. for %%a in (!nn!) do set /a num+=%%a*nnn,nnn*=2
  22. endlocal&set %~2=%num%&goto :EOF
  23. :test1
  24. echo 测试通过
  25. pause
  26. :test2
  27. echo 测试失败
  28. pause
复制代码
方案二,使用goto从第一个字符循环到最后一个字符,如果1开头,数字变化两次则失败,如果0开头,数字变化一次就失败。代码如下:
  1. @echo off
  2. set /p str=请输入32位由0,1组成的字符串
  3. set /a flag=next=1
  4. set /a first=%str:~0,1%
  5. setlocal enabledelayedexpansion
  6. if %first% equ 1 (
  7. :test1
  8. if !next! lss 32 (
  9. set /a aa=%str:~!next!,1%
  10. if !aa! equ 1 ((if !flag! equ 1 (set next+=1& goto :test1) else goto :end1) else (set /a flag=0&set /a next+=1 &goto:test1)) else (set /a flag=0&set /a next+=1&goto :test1)
  11. )else goto :endok) else (
  12. :test2
  13. if !next! lss 32 (
  14. set /a bb=%str:~%next%,1%
  15. if !bb! equ 1 (goto :end1) else (set /a next+=1&goto :test2)))
  16. :endok
  17. echo ok
  18. pause
  19. :end1
  20. echo fail
  21. pause
复制代码
愁死了

通过四楼兄弟的方案解决了问题,简洁高效,再次感谢。抽空继续修正自己的方案,解决问题才能进一步提高

回复 1# 求知路漫漫


请以第一个代码为例,举例说明:
你输入了什么字符串?
希望得到的结果是什么?
代码实际得到的结果是什么?
代码第几行的处理跟预期不一样?

如需上传截图,请找个图床试试,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# Batcher


先谢谢管理员愿意花时间指点。我没用过图床,不会使 。简单给您说明一下。这个说白了就是子网掩码的校验问题。将合法的IP地址转换成二进制形式作为输入,看是否符合掩码规则。
第一个方案,无论输入正确的掩码还是错误的,都会出错。下半部分是借用封装好的函数不会有问题,我感觉是上半部分变量嵌套引用错误引起的,修正测试了一天也没有解决。
第二个方案,一直报语法错误,闪退。也是修改了很久解决不了,才麻烦大家的。

TOP

  1. set /p str=请输入32位由0,1组成的字符串
  2. set str=%str:*0=%
  3. set str=%str:0=%
  4. if defined str (echo 测试失败) else (echo 测试通过)
复制代码
1

评分人数

TOP

回复 4# idwma


    谢谢指导,很巧很简洁。除了一个全1的特例,其它的都涵盖了,再次感谢

我会将标题更改,若是有人帮忙修正原方案就更好。出问题不怕,就怕问题掩盖

TOP

回复 3# 求知路漫漫


第二个方案,建议放弃这个思路。
以后写代码也不要在for或if内部定义标签并goto跳转,把标签的定义全部放在外面。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# Batcher


    明白,第二个确实打算放弃了,嵌套了太多if,要不是vim里面有提示,光括号都晕了。主要是第一个方案失败后,想不到别的了,再次感谢。

TOP

返回列表