标题: [其他] [已解决]批处理如何实现遍历一个未知类型的变量的每一位? [打印本页]
作者: fish 时间: 2010-7-31 18:00 标题: [已解决]批处理如何实现遍历一个未知类型的变量的每一位?
如有下列代码:复制代码
然后我想遍历变量s的每一位然后做一些操作,
比如将每一位逆序输出,
再比如正序输出每一位,但是每位之间要用逗号分割开,
请问各位前辈应该怎么实现呢?
多谢了。。。
[ 本帖最后由 fish 于 2010-8-3 21:54 编辑 ]
作者: neorobin 时间: 2010-7-31 18:57
- @echo off & setlocal enableDelayedExpansion
- set testStr=asdfghjk987654
- set testStr
- call :printReverse testStr & echo.
- call :printDev testStr 0 & (echo )
- pause
- exit /b
-
- :printReverse
- setlocal
- if "!%1!" leq "" exit /b
- set tt=!%1!
- set /p=!tt:~-1!<nul
- set tt=!tt:~,-1!
- call :printReverse tt
- exit /b
-
- :printDev str pt
- setlocal
- if "!%1:~%2,1!" leq "" exit /b
- set /p=!%1:~%2,1!,<nul
- set /a tt=%2+1
- call :printDev %1 !tt!
- exit /b
复制代码
作者: fish 时间: 2010-7-31 21:08 标题: 回复 2楼 的帖子
多谢neorobin前辈的精妙代码,算法已基本看懂,可是我还有一些细节不太清楚,求指教:
1、第一个exit的/b参数有什么用呢?晚辈以为多余。
2、为什么每个子过程里面都写上setlocal,这个是干什么用的,求详解。
3、set /p=!tt:~-1!<nul这句为什么不能写成set /p=%tt:~-1%<nul呢?(后面几句同)这里为什么要用变量延迟呢,这里也不是复合语句啊,请指点迷津。
多谢了。。。
作者: Seter 时间: 2010-7-31 21:19
这就是蛋疼的经典表现~哈哈~
难道这位神牛考虑了特殊字符么~?
作者: neorobin 时间: 2010-7-31 22:09
惭愧的说, 精妙 不敢当, 而且确实是没考虑特殊字符的, 有些代码写法上无必要(习惯或对有些语法理解不清晰), 或者冗余, 或者不严密.
seter 说的好, 蛋疼的精典表现. 我不是神牛, 只是想得到的就写点, 楼主并非不会, 就期待哪位真正好的代码吧
作者: fish 时间: 2010-7-31 22:54 标题: 回复 5楼 的帖子
但是我是真的不会3楼的那些问题啊,请您教教我吧,多谢了。。。
作者: qq106942397 时间: 2010-7-31 23:31
- @echo off&setlocal enabledelayedexpansion
- Title .... →ψ疯行天魔Ф
- set Ф=asdfghjk987654
- set /p Ф=
- call :ψ %Ф%
- echo !SS!
- echo !S:~0,-1!
- pause
-
-
-
-
- :ψ
- set "T=%1"
- :X
- if not defined T goto :eof
- set S=!S!!T:~0,1!,
- set SS=!T:~0,1!!SS!
- set T=!T:~1!
- goto X
-
-
-
- pause
- exit
复制代码
作者: FOR 时间: 2010-8-1 03:23
2楼代码,第一个exit是为了程序能及时退出,并不多余,
否则在按下任意键后,代码又会执行下面的语句
每个子过程都写上setlocal是为了在结束时把变量清空,
但是2楼的代码没有相应的endlocal,如果变量长度超过32个话,就会发生溢出错误。
set /p=!tt:~-1!<nul在这里和set /p=%tt:~-1%<nul是一样的,你自己试试就知道了。
2楼的兄弟,能写出代码就不错,不用管别人怎么说,进步总是慢慢来的,因为我们不是从娘胎里就会写代码的。- @echo off
- set Str=asdfghjk987654
- echo %str%
- :a
- set num=%str:~-1%,%num%
- set var=%var%%str:~-1%
- set str=%str:~0,-1%
- if defined str goto a
- echo %num:~0,-1%
- echo %var%
- pause
复制代码
作者: neorobin 时间: 2010-8-1 12:51 标题: 回复 6楼 的帖子
exit 带上 /b 参数 只是我的一个习惯, 并非任何地方都有必要, 确实如你所言, 第一处就是没必要的.
同样的 !var! 的用法也只是我的习惯, 也并非任何地方都必如此, 但我从未对不需 变量延迟 的情境作过深入学习研究, 也不想花脑筋考虑哪些地方用 %var% 形式就行了, 很少的时候, 我非常明确无需 变量延迟, 可能就会采用 %var% 的形式(不一定).
对于单独的 setlocal 语句, 我也是最近才尝试使用, 暂未深入学习, 之前在 exit /b 前加入了 对应的 endlocal, 正常. 接着又删除了 endlocal, 在本例中, 仍未出错, 我就索性没再加上了. 大家知道, 在高级语言的函数或过程里, 变量默认是局部化的, 退出函数或过程时, 局部变量也会自动被回收. 这里我只是猜测 exit /b 有没这种清理局部变量的功能. 按 FOR 的说法, 大概就是没有了, 以后再花时间来学这个.
对批处理的学习, 我只是用到时才学的, 勉强应付某问题也就罢了, 我的热情仅此而已.
如果你的热情到了相当的高度, 自然而然的会一头扎进去, 也自然的会 精妙娴熟, 所谓 "好之者不如乐之者", 而我只是小有所好.
作者: fish 时间: 2010-8-1 13:40 标题: 回复 7楼、8楼和9楼 的帖子
1、FOR前辈说set /p=!tt:~-1!<nul在这里和set /p=%tt:~-1%<nul是一样的,可我试后发现结果并不一样啊,请问这是为什么呢?
2、是不是说setlocal和endlocal合用实现了变量及时回收的机制呢?
3、第一个exit 的/b的确没有必要测试完毕。
4、7楼和8楼的前辈的代码中的defined用的很妙,学习了,多谢。
继续请求前辈指点中。。。
作者: FOR 时间: 2010-8-1 14:49
确实 if "!%1!" leq "" 这一句不能用%%来引用变量
作者: caruko 时间: 2010-8-2 00:14
neorobin跟我的习惯有点类似..
尽管坛子里很多高手都喜欢“一行代码”,还追求效率能不call就不call...
但我喜欢把程序过程写清楚,把子功能分离出去变成 call +exit /b 形式...
作者: fish 时间: 2010-8-3 21:20 标题: 我现在想问的一个重要问题是
2楼前辈的代码中
set /p=!tt:~-1!<nul为什么不能换成set /p=%tt:~-1%<nul呢?怎么想也想不通。。。
作者: neorobin 时间: 2010-8-3 21:50 标题: 回复 13楼 的帖子
我实测了一下, 发现 % 紧接(也就是说这两个符号之间没有任何别的东西)着 < 就不行, 但把 <nul 移到前面就可以, 如下:复制代码
至于原因, 我不知道, 楼主找找研究下吧
作者: fish 时间: 2010-8-3 21:53 标题: 终于想通了,多谢各位前辈帮忙了,多谢。。。
问题已解决,多谢关注此贴的热心前辈们。。。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |