Board logo

标题: [ 新手习题 5 ] 批处理倒序输出 [打印本页]

作者: wxcute    时间: 2008-11-30 13:05     标题: [ 新手习题 5 ] 批处理倒序输出

有一字符串 “!好你,nc.emohtab.sbb”,请把这个字符串倒过来显示。
  相信通过前面题目地练习,这题也不会难了。

目的:进一步掌握变量截取与条件判断用法,并学会灵活定义变量。

要求:倒序输出字符串。字符串可自定义,不考虑特殊字符。方法不限。
   不需要逐个显示,一次性输出就行。

评分:代码可读性 1 分;
   首个新方法 7 分,第二个 6 分,依次类推,最少 2 分;
   一人可多种方法,新方法追加 3 分,已经出现过的方法追加 1 分。
作者: tireless    时间: 2008-11-30 15:53

  1. @echo off
  2. set str=!好你,nc.emohtab.sbb
  3. for /l %%a in (17 -1 0) do call set /p=%%str:~%%a,1%%<nul
  4. echo.&pause
复制代码

作者: tireless    时间: 2008-11-30 17:07

  1. @echo off & setlocal EnableDelayedExpansion
  2. set str=!好你,nc.emohtab.sbb
  3. :loop
  4. set /a n+=1
  5. set /p=!str:~-%n%,1!<nul
  6. if "!str:~%n%!" neq "" goto loop
  7. echo.&pause
复制代码

作者: Batcher    时间: 2008-11-30 17:20

tireless兄还是应该给新手留点时间来思考嘛^_^
作者: wxcute    时间: 2008-11-30 17:34

是阿,开始没注意。再仔细一看原来这么眼熟,兄手下留情阿!
作者: pusofalse    时间: 2008-12-1 09:57     标题: 凑个热闹^_^

  1. @echo off
  2. set "str=!好你,nc.emohtab.sbb"
  3. :loop
  4. If defined str set "var=%var%%str:~-1%" & set "str=%str:~,-1%" & goto loop
  5. Echo %var%
  6. Pause>nul
复制代码

作者: zhouyongjun    时间: 2008-12-1 15:22     标题: 献丑了!

  1. @set,=!好你,nc.emohtab.sbb&for,/l,%%i,in,(17,-1,0),do,@call,set/p=%%,:~%%i,1%%<nul&ping/n 1 127.1>nul
复制代码

[ 本帖最后由 zhouyongjun 于 2008-12-1 15:24 编辑 ]
作者: suqili56    时间: 2008-12-5 21:00     标题: 我党我军饿

@echo off
set a=好你.nc.emohtab.sbb
set b=%a:~-14%%a:~2,1%%a:~1,1%%a:~0,1%
echo %b%
pause
作者: firewolf85    时间: 2008-12-21 11:48

纯娱版乐代码,哈哈
  1. @echo off
  2. call set /p=                      <nul
  3. set var=!好你,nc.emohtab.sbb
  4. for /l %%i in (0 1 3) do (
  5. ping /n 1 126.1>nul
  6. call set /p=<nul
  7. call set /p=%%var:~%%i,1%%<nul
  8. call set /p=<nul
  9. )
  10. call set /p=<nul
  11. for /l %%i in (4 1 17) do (
  12. ping /n 1 126.1>nul
  13. call set /p=%%var:~%%i,1%%<nul
  14. call set /p=<nul
  15. )
  16. pause>nul
复制代码
速度太快的话自己调下ping /n后面的数,注意加空格。
(编辑)感谢冰版鼓励,修改了一下代码,使它更娱乐一点。
  1. @echo off
  2. mode con cols=40 lines=8
  3. title bbs.bathome.net,你好!
  4. set c=00F53462B89AC7ED10
  5. :loop
  6. CLS
  7. ECHO.
  8. ECHO.
  9. ECHO.
  10. set /a num=%random%%%16
  11. call set col=%%c:~%num%,2%%
  12. COLOR %col%
  13. call set /p=                              <nul
  14. set var=!好你,nc.emohtab.sbb
  15. for /l %%i in (0 1 3) do (
  16. ping /n 1 126.1>nul
  17. call set /p=<nul
  18. call set /p=%%var:~%%i,1%%<nul
  19. call set /p=<nul
  20. )
  21. call set /p=<nul
  22. for /l %%i in (4 1 17) do (
  23. ping /n 1 126.1>nul
  24. call set /p=%%var:~%%i,1%%<nul
  25. call set /p=<nul
  26. )
  27. ping -n 3 127.1>nul
  28. goto loop
复制代码

[ 本帖最后由 firewolf85 于 2008-12-21 12:29 编辑 ]
作者: leaparde    时间: 2008-12-26 13:19

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str1=!好你,nc.emohtab.sbb
  4. set /a n=0
  5. :loop
  6. set str2=!str1:~%n%,1!%str2%
  7. set /a n+=1
  8. if "!str1:~%n%,1!" neq "" goto loop
  9. echo 原字符串为:    %str1%
  10. echo 倒序后字符串为:%str2%
  11. pause>nul
复制代码


题目是可以完成了,但是遇到几个不明白的地方,希望高人指点一二。

第一:如果字符串中的感叹号换成英文输入法下的感叹号,上面的代码就不显示感叹号了,请问如何解决,尝试过楼上高手的代码,用set /p是可以输出英文感叹号的,为什么呢?


第三:如果将以上代码改一下,换成下面的

@echo off
setlocal enabledelayedexpansion
set str1=!好你,nc.emohtab.sbb
:loop
set /a n+=1
set str2=%str2%!str1:~-%n%,1!
if "!str1:~-%n%,1!" neq "" goto loop
echo 原字符串为:    %str1%
echo 倒序后字符串为:%str2%
pause>nul

这个代码就不会停止,请教是何道理?
只不过取字符的方向换了下而已啊。
作者: lhjoanna    时间: 2008-12-27 11:39

给你两个例子,自己体会下看。以后遇到问题可以先自己写一些辅助代码来查看下问题所在。
  1. @echo off
  2. echo !
  3. echo ^!
  4. setlocal enabledelayedexpansion
  5. echo !
  6. echo ^!
  7. echo ^^!
  8. pause>nul
复制代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=12345678
  4. echo !str:~-7,1!
  5. echo !str:~-8,1!
  6. echo !str:~-10,1!
  7. echo !str:~-10,1!
  8. echo !str:~-15,1!
  9. echo !str:~-20,1!
  10. echo !str:~-100,1!
  11. echo !str:~-10000,1!
  12. pause>nul
复制代码

变量延迟详解
[url=http://www.cn-dos.net/forum/viewthread.php?tid=28273]http://www.cn-dos.net/forum/viewthread.php?tid=28273[/url]

什么情况下该使用变量延迟
http://www.cn-dos.net/forum/viewthread.php?tid=20733

一个变量嵌套变量的问题
http://www.cn-dos.net/forum/viewthread.php?tid=41143
作者: leaparde    时间: 2008-12-30 08:42

非常感谢楼上高手讲解,一定努力学习,自己多动手才是王道,谢谢楼上大侠!
作者: leaparde    时间: 2008-12-30 09:06


wxcute,小弟愚笨,没看懂啥意思啊

我上下两段代码不一样的,一个有负号,一个没有的。
作者: wxcute    时间: 2008-12-30 11:07     标题: 回复 13楼 的帖子

一个长度固定的字串,从前面数和从后面数长度是不会变的。
作者: leaparde    时间: 2008-12-30 12:23     标题: 回14楼 wxcute 帖子

原帖由 wxcute 于 2008-12-30 11:07 发表
一个长度固定的字串,从前面数和从后面数长度是不会变的。


楼主说的有道理,总算理解楼主的意思了,高手说话都不一样。

[ 本帖最后由 leaparde 于 2008-12-30 12:28 编辑 ]
作者: leaparde    时间: 2008-12-30 12:30

但是还是有一点疑问,为什么我从后往前去判断的时候,他就不停下来呢??

如果有高手指点一下就好了,谢谢。
作者: lhjoanna    时间: 2008-12-30 12:54

此例你还是没仔细思考啊,再运行过后看你的这句:
if "!str1:~-%n%,1!" neq "" goto loop
循环能停止吗?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=12345678
  4. echo !str:~-7,1!
  5. echo !str:~-8,1!
  6. echo !str:~-10,1!
  7. echo !str:~-10,1!
  8. echo !str:~-15,1!
  9. echo !str:~-20,1!
  10. echo !str:~-100,1!
  11. pause>nul
复制代码

作者: p05401144    时间: 2009-1-19 11:03

@echo off & setlocal EnableDelayedExpansion
set str=!好你,nc.emohtab.sbb
for /l %%i in (17,-1,0) do set /p=!str:~%%i,1!<nul
echo.
pause
作者: zcy85611    时间: 2009-2-3 14:27

按本题的要求:
  1. @echo off
  2. set str=!好你,nc.emohtab.sbb
  3. set m=1
  4. :loop
  5. set /a n+=1
  6. if "%m%"=="" (echo.&pause) else (
  7. set /p t=!str:~-%n%,1!<nul
  8. set m=!str:~%n%!
  9. goto loop
  10. )
复制代码
任意输入字符串,反向输出
  1. @echo off
  2. set /p a=请输入字符串:
  3. set str=%a%
  4. set m=1
  5. :loop
  6. set /a n+=1
  7. if "%m%"=="" (echo.&pause) else (
  8. set /p t=!str:~-%n%,1!<nul
  9. set m=!str:~%n%!
  10. goto loop)
复制代码
我总感觉我写的代码麻烦了一点,不知道有没有按我这个思路,更简单一点的代码

[ 本帖最后由 zcy85611 于 2009-2-3 15:38 编辑 ]
作者: keen    时间: 2009-3-29 14:11

我的:
  1. @echo off
  2. set str=!好你,nc.emohtab.sbb
  3. :loop
  4. call, set /p=%%str:~-1%%<nul
  5. set str=%str:~0,-1%
  6. if "%str%"=="" goto end
  7. goto loop
  8. :end
  9. pause>nul
复制代码

作者: keen    时间: 2009-3-29 14:30

再来:
  1. @echo off
  2. set str=!好你,nc.emohtab.sbb
  3. for /l %%i in (17 -1 0) do call, set /p=%%str:~%%i,1%%<nul
  4. pause>nul
复制代码

作者: keen    时间: 2009-3-29 15:20

输入任意字符:
  1. @echo off
  2. set /p a=please input:
  3. set b=%a%
  4. echo.
  5. set /p=你输入的是:<nul
  6. :loop
  7. call, set /p=%%a:~0,1%%<nul
  8. set a=%a:~1%
  9. if "%a%"=="" goto zh
  10. set /a n+=1
  11. goto loop
  12. :zh
  13. echo.
  14. echo.
  15. set /p=倒序后是:<nul
  16. for /l %%i in (%n% -1 0) do call, set /p=%%b:~%%i,1%%<nul
  17. pause>nul
复制代码

作者: rat    时间: 2009-3-29 15:34

@mshta vbscript:alert(StrReverse("!好你,nc.emohtab.sbb"))(close)
作者: keen    时间: 2009-3-29 15:49

任意字符串:
  1. @echo off
  2. del a.txt>nul 2>nul
  3. set /p a=please iput:
  4. echo %a%>a.txt
  5. echo.>>a.txt
  6. for /f "tokens=1 delims=:" %%i in ('findstr /o .* a.txt') do set /a l=%%i-2
  7. for /l %%k in (%l% -1 0) do call, set /p=%%a:~%%k,1%%<nul
  8. del a.txt>nul 2>nul
  9. pause>nul
复制代码

[ 本帖最后由 keen 于 2009-3-29 15:50 编辑 ]
作者: rat    时间: 2009-3-29 16:26

  1. @set /p s=Plz input:&&more /e +1 "%~f0"|call debug t %%s%%|findstr "^[^I\-0P]"&pause>nul&exit/b
  2. a100
  3. MOV     CL,[0080]
  4. DEC     CX
  5. MOV     AH,02
  6. MOV     BX,CX
  7. MOV     DL,[BX+0081]
  8. INT     21
  9. LOOP    0107
  10. INT     20
  11. g
  12. q
复制代码

[ 本帖最后由 rat 于 2009-3-29 17:52 编辑 ]
作者: Lumiere    时间: 2009-3-29 21:08

for /l %%a in (17 -1 0) do call set /p=%%str:~%%a,1%%<nul
谁给解释一下上面一句啊?后面的set怎么不符合语法规则呢?可是运行是对的
作者: Batcher    时间: 2009-3-29 22:13     标题: 回复 26楼 的帖子

为什么说不符合语法规则?
作者: cainiao736    时间: 2009-3-30 23:09

  1. @echo off&setlocal enabledelayedexpansion
  2. set str=!好你,nc.emohtab.sbb
  3. for /l %%i in (-1,-1,-18) do (
  4. set a=!str:~%%i,1!
  5. set b=!b!!a!)
  6. echo %b%
  7. pause
复制代码

作者: sjzong    时间: 2009-5-5 23:05     标题: 我的代码

  1. @echo off
  2. set "str=!好你,nc.emohtab.sbb"
  3. set "var="
  4. :loop
  5. if not "%str:~1,1%"=="" (set "var=%str:~0,1%%var%"&set "str=%str:~1%"&goto loop)
  6. echo %str:~0,1%%var%
  7. Pause>nul
复制代码


[ 本帖最后由 sjzong 于 2009-5-5 23:06 编辑 ]
作者: scarcr    时间: 2011-8-4 17:08

回复 1# wxcute
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "a=!好你,nc.emohtab.sbb"
  4. for /l %%i in (17 -1 0) do (
  5.     set b=!a:~%%i,1!
  6. set /p=!b!<nul
  7. )
  8. pause>nul
复制代码

作者: PCL505512957    时间: 2011-8-18 00:19

  1. @if not defined debug @echo off
  2. set var=!好你,nc.emohtab.sbb
  3. for /l %%i in (17 -1 0) do call set/p a=%%var:~%%i,1%%<nul&ping -n 1 127.1>nul
  4. pause >nul
复制代码

作者: 悬崖之树    时间: 2012-7-9 22:03

本帖最后由 悬崖之树 于 2012-7-15 12:13 编辑

回复 2# tireless


   
@echo off & setlocal EnableDelayedExpansion
set str=!好你,nc.emohtab.sbb
:loop
set /a n+=1
set /p=!str:~-%n%,1!<nul
if "!str:~%n%!" neq "" goto loop
echo.&pause


这个批处理最后将多循环一次,把""加在结果字符串的最后。
应改成:
  1. @echo off & setlocal EnableDelayedExpansion
  2. set str=!好你,nc.emohtab.sbb
  3. :loop
  4. set /a n+=1
  5. if "!str:~%n%!" neq ""  (
  6. set /p=!str:~-%n%,1!<nul&goto loop)
  7. echo.&pause
复制代码
晕,我自己搞错了,不好意思。真是不改菜鸟本色啊!!
作者: 539956485    时间: 2012-10-20 21:16

  1. @echo off
  2. echo nc.enohtab.sbb > text.txt
  3. for /f "tokens=1-3 delims=." %%i in (text.txt) do (echo %%k %%j %%i)
  4. del text.txt /q
  5. pause
复制代码

作者: o00o00o00    时间: 2012-11-5 12:04

回复 15# leaparde


    @echo off & setlocal EnableDelayedExpansion
set str=!好你,nc.emohtab.sbb
:loop
set /a n+=1
set /p=!str:~-%n%,1!<nul
if "!str:~%n%!" neq "" goto loop
echo.&pause
     代码中的 set /p=!str:~-%n%,1!<nul
什么意思  和set /p=%str:~-%n%,1%<nul
的区别是什么
作者: Batcher    时间: 2012-11-5 12:46

回复 34# o00o00o00


批处理中的变量延迟扩展、变量嵌套
http://www.bathome.net/thread-2899-1-1.html
作者: Clarkky    时间: 2013-1-27 23:19

  1. @echo off
  2. set Enter=!好你,nc.emohtab.sbb
  3. set Output=
  4. :Start
  5. if not "%Enter%"=="" (
  6. set Output=%Output%%Enter:~-1%
  7. set Enter=%Enter:~0,-1%
  8. goto Start
  9. )
  10. echo %Output%
  11. pause>nul
复制代码

作者: ann    时间: 2014-12-23 21:54

有个限制,第一个字符只能出现一次
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "aa=!好你,nc.emohtab.sbb"
  4. for /l %%a in (1 1 999999999) do (
  5. if "!aa:~-%%a,1!" neq "!aa:~0,1!" (set /p =!aa:~-%%a,1!<nul) else (call :end))
  6. :end
  7. echo %aa:~0,1%
  8. pause>nul&exit
复制代码

作者: DAIC    时间: 2014-12-23 22:14

回复 37# ann


    尽量不要用 for /l %%a in (1 1 999999999) 这种方法,效率太低。
作者: shelluserwlb    时间: 2014-12-24 14:26

本帖最后由 shelluserwlb 于 2014-12-24 14:33 编辑

通用程序
  1. @echo off
  2. set "str=!好你,nc.emohtab.sbb"
  3. echo 原字符串:  %str%
  4. :1
  5. set "str1=%str1%%str:~-1%"
  6. set "str=%str:~0,-1%"
  7. if defined str (goto :1) else (echo 新字符串:  %str1%)
  8. pause>nul
复制代码

作者: ann    时间: 2014-12-25 18:54

回复 38# DAIC


    我想用for /l %%a in ( ) do (set /p =!aa:~-!js!,1!<nul&set /a js+=1)。但是它不能识别为变量位移,不能输出想要的结果
作者: DAIC    时间: 2014-12-25 20:39

回复 40# ann


变量嵌套的语法错了,参考:
http://bbs.bathome.net/thread-2899-1-1.html
作者: ann    时间: 2014-12-28 17:11

回复 41# DAIC


    看了,没懂,,,
作者: ann    时间: 2014-12-28 22:49

回复 41# DAIC


    那请问按我这个思路,这一句改怎么写呢?




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2