找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 20926|回复: 6

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

[复制链接]
发表于 2022-3-9 15:50:40 | 显示全部楼层 |阅读模式
本帖最后由 求知路漫漫 于 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
复制代码
愁死了

通过四楼兄弟的方案解决了问题,简洁高效,再次感谢。抽空继续修正自己的方案,解决问题才能进一步提高
发表于 2022-3-9 16:09:34 | 显示全部楼层
回复 1# 求知路漫漫


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

如需上传截图,请找个图床试试,例如:
http://bbs.bathome.net/thread-60985-1-1.html
 楼主| 发表于 2022-3-9 16:23:04 | 显示全部楼层
回复 2# Batcher


先谢谢管理员愿意花时间指点。我没用过图床,不会使 。简单给您说明一下。这个说白了就是子网掩码的校验问题。将合法的IP地址转换成二进制形式作为输入,看是否符合掩码规则。
第一个方案,无论输入正确的掩码还是错误的,都会出错。下半部分是借用封装好的函数不会有问题,我感觉是上半部分变量嵌套引用错误引起的,修正测试了一天也没有解决。
第二个方案,一直报语法错误,闪退。也是修改了很久解决不了,才麻烦大家的。
发表于 2022-3-9 16:31:01 | 显示全部楼层
  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技术 +1 收起 理由
求知路漫漫 + 1 谢谢兄弟

查看全部评分

 楼主| 发表于 2022-3-9 17:57:41 | 显示全部楼层
回复 4# idwma


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

我会将标题更改,若是有人帮忙修正原方案就更好。出问题不怕,就怕问题掩盖
发表于 2022-3-9 18:15:56 | 显示全部楼层
回复 3# 求知路漫漫


第二个方案,建议放弃这个思路。
以后写代码也不要在for或if内部定义标签并goto跳转,把标签的定义全部放在外面。
 楼主| 发表于 2022-3-9 19:29:43 | 显示全部楼层
回复 6# Batcher


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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 07:16 , Processed in 0.029190 second(s), 11 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表