标题: [文本处理] 【已解决】字符串截取判断的批处理出错找不到问题 [打印本页]
作者: 求知路漫漫 时间: 2022-3-9 15:50 标题: 【已解决】字符串截取判断的批处理出错找不到问题
本帖最后由 求知路漫漫 于 2022-3-9 18:05 编辑
目的:对1和0组成的字符串,从左往右,如果出现0之后,不能出现1,测试通过,否则测试失败。想了两个方案,都总出问题,又解决不了,谢谢执教。
方案一。从左第一个起,一个一个截取,若出现数字0,将剩下的转换成数字,如果为0则成功,否则失败。代码如下:- set /p str=请输入32位由0,1组成的字符串
- setlocal enabledelayedexpansion
- for /L %%i in (0,1,31) do (
- ::逐次截取第一位
- set /a aa=!!str:~%%i,1!!
- if !aa! equ 0 (
- ::需要将剩余的字符串转换位十进制,否则数值超限
- call :2x10 %%str:~!i!%% cc
- if !cc! ==0 (goto :test1) else goto :test2
- )
- )
- endlocal
-
- echo 出现这个说明程序出错了,请检查代码!
- pause
-
- ::借用十进制转二进制函数
- :2x10 2进制转 10进制 @随风 @bbs.bathome.net (封装)
- @echo off&setlocal enabledelayedexpansion
- set /a nnn=1,num=0&set nn=&set "n=%~1"
- set "n=!n:0= 0!"&set "n=!n:1= 1!"
- for %%a in (!n!) do set "nn=%%a !nn!"
- for %%a in (!nn!) do set /a num+=%%a*nnn,nnn*=2
- endlocal&set %~2=%num%&goto :EOF
- :test1
- echo 测试通过
- pause
- :test2
- echo 测试失败
- pause
复制代码
方案二,使用goto从第一个字符循环到最后一个字符,如果1开头,数字变化两次则失败,如果0开头,数字变化一次就失败。代码如下:- @echo off
-
- set /p str=请输入32位由0,1组成的字符串
-
- set /a flag=next=1
- set /a first=%str:~0,1%
- setlocal enabledelayedexpansion
- if %first% equ 1 (
- :test1
- if !next! lss 32 (
- set /a aa=%str:~!next!,1%
- 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)
- )else goto :endok) else (
- :test2
- if !next! lss 32 (
- set /a bb=%str:~%next%,1%
- if !bb! equ 1 (goto :end1) else (set /a next+=1&goto :test2)))
- :endok
- echo ok
- pause
- :end1
- echo fail
- pause
复制代码
愁死了
通过四楼兄弟的方案解决了问题,简洁高效,再次感谢。抽空继续修正自己的方案,解决问题才能进一步提高
作者: Batcher 时间: 2022-3-9 16:09
回复 1# 求知路漫漫
请以第一个代码为例,举例说明:
你输入了什么字符串?
希望得到的结果是什么?
代码实际得到的结果是什么?
代码第几行的处理跟预期不一样?
如需上传截图,请找个图床试试,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: 求知路漫漫 时间: 2022-3-9 16:23
回复 2# Batcher
先谢谢管理员愿意花时间指点。我没用过图床,不会使 。简单给您说明一下。这个说白了就是子网掩码的校验问题。将合法的IP地址转换成二进制形式作为输入,看是否符合掩码规则。
第一个方案,无论输入正确的掩码还是错误的,都会出错。下半部分是借用封装好的函数不会有问题,我感觉是上半部分变量嵌套引用错误引起的,修正测试了一天也没有解决。
第二个方案,一直报语法错误,闪退。也是修改了很久解决不了,才麻烦大家的。
作者: idwma 时间: 2022-3-9 16:31
- set /p str=请输入32位由0,1组成的字符串
- set str=%str:*0=%
- set str=%str:0=%
- if defined str (echo 测试失败) else (echo 测试通过)
复制代码
作者: 求知路漫漫 时间: 2022-3-9 17:57
回复 4# idwma
谢谢指导,很巧很简洁。除了一个全1的特例,其它的都涵盖了,再次感谢
我会将标题更改,若是有人帮忙修正原方案就更好。出问题不怕,就怕问题掩盖
作者: Batcher 时间: 2022-3-9 18:15
回复 3# 求知路漫漫
第二个方案,建议放弃这个思路。
以后写代码也不要在for或if内部定义标签并goto跳转,把标签的定义全部放在外面。
作者: 求知路漫漫 时间: 2022-3-9 19:29
回复 6# Batcher
明白,第二个确实打算放弃了,嵌套了太多if,要不是vim里面有提示,光括号都晕了。主要是第一个方案失败后,想不到别的了,再次感谢。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |