标题: [出题]批处理限制输入只能为字母且个数在3-10之间 [打印本页]
作者: 随风 时间: 2009-3-27 21:19 标题: [出题]批处理限制输入只能为字母且个数在3-10之间
在别的论坛看到这个题目,大家没事练练手吧,看都有些什么方法实现。
要求:对用户的输入进行判断,字符数不能少于3个,大于10个,且必须是字母(不分大小写)
作者: tireless 时间: 2009-3-27 22:07
- @echo off
- :repeat
- set /p input=请输入:
- if "%input:~2,1%" equ "" goto repeat
- if "%input:~10,1%" neq "" goto repeat
- for /f "delims=abcdefghijklmnopqrstuvwxyz" %%a in ("%input%") do (
- if "%%a" neq "" goto repeat
- )
- pause
复制代码
作者: 随风 时间: 2009-3-27 22:15 标题: 回复 2楼 的帖子
未对大小写作判断。。
作者: zhouyongjun 时间: 2009-3-27 22:39
- @echo off
- :repeat
- set/p input=请输入:
- if "%input:~2,1%" equ "" goto repeat
- if "%input:~10,1%" neq "" goto repeat
- echo.%input%|findstr/i "^[a-z]*$">nul2>nul||goto repeat
- pause
复制代码
[ 本帖最后由 zhouyongjun 于 2009-3-27 23:08 编辑 ]
作者: 随风 时间: 2009-3-27 22:46 标题: 回复 4楼 的帖子
>nul2>nul 两句中间应该要个空格吧。
作者: Batcher 时间: 2009-3-27 22:50
- @echo off
- rem 限制输入3位至10位字母
- set LenMin=3
- set LenMax=10
- set AllLetter=a b c d e f g h i j k l m n o p q r s t u v w x y z
-
- :GetInput
- set input=
- set /p "input=请输入3至10位字母:"
- if "%input%" neq "" (
- if "%input:~2,1%" equ "" (
- echo 不足%LenMin%位
- goto :GetInput
- ) else if "%input:~10,1%" neq "" (
- echo 多于%LenMax%位
- goto :GetInput
- )
- ) else (
- echo 输入不能为空
- goto :GetInput
- )
- setlocal enabledelayedexpansion
- for %%a in (%AllLetter%) do (
- set input=!input:%%a=!
- if "!input!" equ "" (
- goto :RightInput
- )
- )
- if "!input!" neq "" (
- echo 只能输入纯字母[a-zA-Z]
- endlocal
- goto :GetInput
- )
-
- :RightInput
- echo 恭喜输入正确
- pause
复制代码
[ 本帖最后由 Batcher 于 2009-3-29 14:20 编辑 ]
作者: tireless 时间: 2009-3-27 22:50
- @echo off&setlocal enabledelayedexpansion
- :repeat
- set /p input=请输入:
- echo !input!>%temp%\#tmp#
- findstr /xi "[a-z][a-z][a-z] [a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]" %temp%\#tmp# >nul || goto repeat
- pause
复制代码
或者:- @echo off
- :repeat
- set /p input=请输入:
- (call set/p="%%input%%"<nul&echo.)>%temp%\#tmp#
- findstr /xi "[a-z][a-z][a-z] [a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z] [a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]" %temp%\#tmp# >nul || goto repeat
- pause
复制代码
[ 本帖最后由 tireless 于 2009-3-27 23:47 编辑 ]
作者: 随风 时间: 2009-3-27 22:55 标题: 回复 7楼 的帖子
I 服了 you !
思路倒是不错,只是代码。。。。。
作者: Batcher 时间: 2009-3-27 23:01 标题: 回复 4楼 的帖子
输入off
代码出现误判
^_^
作者: 随风 时间: 2009-3-27 23:03
batcher 真是细心 echo.%input% 就可以解决了
作者: zhouyongjun 时间: 2009-3-27 23:08 标题: 回复 9楼 的帖子
哈哈,batcher思维果然严谨
作者: tireless 时间: 2009-3-27 23:13
7楼代码已修改。
代码难看不代表效率低啊
[ 本帖最后由 tireless 于 2009-3-27 23:34 编辑 ]
作者: Batcher 时间: 2009-3-27 23:15 标题: 回复 12楼 的帖子
7楼是不是再改改?否则遇到off一样会误判^_^
作者: 随风 时间: 2009-3-27 23:17 标题: 回复 12楼 的帖子
处理 off 的办法以在10楼解决,不行么?
代码除了要讲究效率以外,还要在可能的情况下讲究简洁和美观。
作者: Batcher 时间: 2009-3-27 23:19 标题: 回复 14楼 的帖子
可以啊,我只是建议tireless兄更新一下7楼的代码 :)
作者: 随风 时间: 2009-3-27 23:21 标题: 回复 15楼 batcher 的帖子
汗!我14楼的回复是对12楼的,不是说你啊。。
作者: tireless 时间: 2009-3-27 23:41
好像要用 findstr 处理特殊字符,只有用 7 楼的方法(生成临时文件)
作者: 随风 时间: 2009-3-27 23:48 标题: 回复 17楼 的帖子
为什么不认真看看回帖呢?
作者: tireless 时间: 2009-3-27 23:52 标题: 回复 18楼 的帖子
看了。试了会出错。要不你把完整代码写下,我不信不会出错...
作者: 随风 时间: 2009-3-27 23:53 标题: 回复 19楼 的帖子
你所说的“特殊字符”是指什么? off 吗?
作者: Batcher 时间: 2009-3-27 23:55 标题: 回复 20楼 的帖子
他说的可能是用户输入的重定向符号、双引号等特殊字符吧
作者: tireless 时间: 2009-3-27 23:55 标题: 回复 20楼 的帖子
除了 off 还包括 ^ > & " 等
作者: rat 时间: 2009-3-27 23:56
- @set /p s=Plz input:
- @mshta javascript:alert(/^^[a-z]{3,10}$/i.test("%s%"));close()
复制代码
作者: 随风 时间: 2009-3-27 23:57
特殊字符 是cmd 永远的痛,所以在不是明确要处理的情况下,一般是默认没有特殊字符的,
处理 off 的方法,10楼以有明确代码。
作者: batman 时间: 2009-3-28 00:03
没考虑特殊字符:- @echo off
- set /p input=请输入:
- echo.%input%>1.temp
- for /r %%a in (*.temp) do set /a a=%%~za-2
- if %a% lss 3 echo 输入字符少于3个&goto :end
- if %a% gtr 10 echo 输入字符多于10个&goto :end
- echo.%input%|findstr "[^a-z]">nul&&echo 输入字符中有非字母字符&&goto end
- echo 输入字符符合要求
- :end
- del /q 1.temp&pause>nul
复制代码
[ 本帖最后由 batman 于 2009-3-28 00:10 编辑 ]
作者: 随风 时间: 2009-3-28 00:06
通过文件大小来判断字符数,果然比较新颖。echo %input% 为什么不写成echo.%input%呢?
作者: batman 时间: 2009-3-28 00:10
所言即是,已修改
作者: tireless 时间: 2009-3-28 00:17 标题: 回复 25楼 的帖子
for /r %%a in (*.temp) do set /a a=%%~za-2
可以换成:
for %%a in (1.temp) do set /a a=%%~za-2
-----------
findstr "[^a-z]" 没忽略大小写......不过都是鸡毛蒜皮的事......
作者: Batcher 时间: 2009-3-28 00:17 标题: 回复 25楼 的帖子
for /r 的用意何在?
与直接for相比,其优势在哪里?
汗水,28楼和29楼都是2009-3-28 00:17,我跑到tireless兄后面去了,呵呵。
作者: Batcher 时间: 2009-3-28 00:22 标题: 回复 28楼 的帖子
这里是不需要使用/i来忽略大小写的,正则表达式足矣。
作者: zqz0012005 时间: 2009-3-28 08:49 标题: 回复 17楼 的帖子
如果要使用管道,的确要用到临时文件才行。
http://www.bathome.net/viewthread.php?tid=3830&page=1#pid24372
开始我老想着用findstr判断字符,发现必须要用到临时文件。
[ 本帖最后由 zqz0012005 于 2009-3-28 14:29 编辑 ]
作者: 随风 时间: 2009-3-28 19:54
其实所有的判断都可以用findstr来完成,并不需要临时文件。
兼容大部分特殊符号。
- @echo off&set "f=findstr .....|findstr /v ............."
- :loop
- echo.&set a=a&set var=&set /p var= 请输入3至10位英文字母 &cls
- echo."%var%"|%f%|findstr "^\"[a-zA-Z]*\"$">nul&&set "a="
- if defined a (echo 输入错误) else echo %var% 正确
- goto loop
复制代码
[ 本帖最后由 随风 于 2009-3-28 21:02 编辑 ]
作者: Batcher 时间: 2009-3-28 20:28 标题: 回复 32楼 的帖子
31楼说的临时文件估计是想兼容所有特殊符号
作者: tireless 时间: 2009-3-28 20:54 标题: 回复 32楼 的帖子
输入 Zip,提示“输入错误”
输入 ",显示 """|findstr .....|findstr /v .............|findstr "\"[a-z]*\"$">nul&&set "a="
输入 "&",批处理退出。
作者: 随风 时间: 2009-3-28 21:06 标题: 回复 34楼 的帖子
已经说明可兼容大部分特殊符号,而不是所有特殊符号,其中引号就是没法处理的
输入 Zip 提示错误,已经改正,由此引发另一个问题,大家可以探讨一下
为什么第一个字母为大写Z时,findstr 就必须指定忽略大小写呢?
echo Zip|findstr "^[a-z]*$" 错误
echo Yip|findstr "^[a-z]*$" 正确
echo Zip|findstr /i "^[a-z]*$" 正确
作者: zjw767676 时间: 2009-3-29 13:06
原帖由 Batcher 于 2009-3-27 22:50 发表
if "!input!" neq "" (
echo 只能输入纯字母[a-zA-Z]
goto :GetInput
)
endlocal
这里的endlocal好像执行不到,有必要加吗?
作者: 随风 时间: 2009-3-29 13:13 标题: 回复 36楼 的帖子
执行的到,不信你连续33次输入错误看看。
作者: zjw767676 时间: 2009-3-29 13:49 标题: 回复 37楼 的帖子
原来是这样- 请输入3至10位字母:134
- 已经达到最大的 setlocal 递归层
- 只能输入纯字母[a-zA-Z]
- 请输入3至10位字母:
复制代码
去掉endlocal后:- 请输入3至10位字母:134
- 已经达到最大的 setlocal 递归层。
- 只能输入纯字母[a-zA-Z]
- 请输入3至10位字母:135
- 已经达到最大的 setlocal 递归层。
- 只能输入纯字母[a-zA-Z]
- 请输入3至10位字母:136
- 已经达到最大的 setlocal 递归层。
- 只能输入纯字母[a-zA-Z]
- 请输入3至10位字母:
复制代码
感谢随风,受教了!
作者: zjw767676 时间: 2009-3-29 14:01 标题: 回复 32楼 的帖子
set "f=findstr .....|findstr /v ............."
请教这个命令怎么解释?
set f=是把命令赋予f,里面的.........是什么意思?
作者: rat 时间: 2009-3-29 14:08 标题: 回复 37、38楼 的帖子
确实执行不到endlocal
作者: Batcher 时间: 2009-3-29 14:13 标题: 回复 39楼 的帖子
点,在正则表达式中是通配符,表示任意一位字符。
.. 表示任意2位字符
... 表示任意3位字符
.... 表示任意4位字符
以此类推
作者: 随风 时间: 2009-3-29 14:18 标题: 回复 40楼 的帖子
确实应该是执行不到,batcher 是否应该考虑改一下endlocal的位置。
作者: Batcher 时间: 2009-3-29 14:20 标题: 回复 42楼 的帖子
Done.
改好了。
作者: everest79 时间: 2009-3-30 01:43
32l学习了,思路很别致
作者: cainiao736 时间: 2009-4-6 17:18
- @echo off
- set /p str=请输入3到10个字母:
- set var=%str%
- set n=0
- :begin
- set a=%str:~0,1%
- set /a n+=1
- set str=%str:~1%
- if not "%str%"=="" goto begin
- if %n% lss 3 echo 字符数不符&&goto eof
- if %n% gtr 10 echo 字符数不符&&goto eof
- echo %var%|findstr "[^a-z]">nul&&echo 输入的字符不完全是字母&&goto eof
- echo 输入正确!
- :eof
- pause
复制代码
[ 本帖最后由 cainiao736 于 2009-4-6 22:35 编辑 ]
作者: Batcher 时间: 2009-4-6 17:27 标题: 回复 45楼 的帖子
学学怎么调试代码吧:
不要双击运行
把代码保存为C:\test.bat
把@echo off删除
开始
运行
cmd
C:\test.bat
看看执行过程再好好想想
作者: cainiao736 时间: 2009-4-6 22:36
谢谢Batcher的提醒,45L代码已经修改
作者: zqz0012005 时间: 2009-4-14 11:02 标题: 回复 31楼 的帖子
竟然忘了,可以通过 set var 列举变量的方式来避免直接显示变量值,就可以绕过特殊字符问题。
set var|findstr /x "var=[a-Z]*"
感谢此帖提醒:http://www.bathome.net/thread-4159-1-1.html
作者: netbenton 时间: 2009-4-23 23:38
呵呵,原来区分字母如此简单!- @echo off&setlocal enabledelayedexpansion
- :begin
- set n=0
- :rep
- set/a n+=1
- set /p str=输入3-10个字母:
- for /l %%a in (0,1,10) do (
- set one=!str:~%%a,1!
- if not defined one if %%a geq 3 (goto :ok) else (echo 不足3个&goto :rep)
- if !one! lss a echo 有非法字符&goto :rep
- if !one! gtr z echo 有中文字符&goto :rep
- )
- echo 超过10个&goto :rep
- :ok
- echo 你输入了%n%次终于搞对一次了:!str!
- echo.
- echo 再来!
- goto :begin
复制代码
[ 本帖最后由 netbenton 于 2009-4-23 23:43 编辑 ]
作者: zljzsmzzx 时间: 2009-6-10 18:52 标题: 回复 49楼 的帖子
不能识别大写字母。我把这句“if !one! gtr z echo 有中文字符&goto :rep”改成大写字母“Z”:“if !one! gtr Z echo 有中文字符&goto :rep”。测试了一下好像可以。不知道有没有错。
作者: yi12133 时间: 2009-7-1 15:33
难倒不是很难,不过有几个代码不知道什么意思。
作者: keen 时间: 2009-7-1 16:54 标题: 回复 51楼 的帖子
有什么不懂,可以在相应版块发帖求助。
作者: canyuexiaolang 时间: 2009-8-14 19:48 标题: 回复 7楼 的帖子
那要求只能输入数字你还不得……晕死
作者: Seter 时间: 2009-8-21 09:03
原帖由 canyuexiaolang 于 2009-8-14 19:48 发表
那要求只能输入数字你还不得……晕死
弱弱的问,数字的话直接比较就可以了把?
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |