[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-016】批处理判断字符串长度

呵呵大家也看到题目--基础练习。我不会出的太难的,这道题的思路应该会比较多的
不过我也还没开始做,希望大家积极参与哦。(最惨的就是只能加别人两分,郁闷)
习题1.1 字符串长度不超过80。不含特殊字符
             例 i like the bathome,because here is the batch of the world.
       1.2 字符串长度小于255,含有特殊字符,试求其长度。
            例 %%a%%!ver!&^^^ ^*~                     are you o                 k ?" : \  / ` `  verfdxcweippo opj x ds gw !%%
一般的,先求1.1的题目。看谁的代码灵活、简洁、思路清晰。然后再做1.2


(汗。中文不用考虑……)
其实我也是想征集一个比较好的办法……估计如果有中文的话。或许可以重定向到文本然后再判断字节吧。我猜可以的。

最后:一题多解,可别只用 重定向文本 那个方法哈。

[ 本帖最后由 batman 于 2008-8-25 14:19 编辑 ]

  1. :%%a%%!ver!&^^^ ^*~                     are you o                 k ?" : \  / ` `  verfdxcweippo opj x ds gw !%%
  2. ::将字符串放于第一行,并加上:
  3. @echo off & setlocal EnableDelayedExpansion
  4. set /p str=<%0
  5. :count
  6. set str=!str:~1!
  7. if defined str ( set /a n+=1 & goto :count )
  8. echo %n%
复制代码

TOP

习题1.2中,如果字符串中加一个单%,有些代码就可能失效。

TOP

这一道题目牵出很多故事,太精彩了,真是受益匪浅。

TOP

回复 70# CrLf
可是那个字符串哪里回车换行了,哦,预处理默认echo后回车换行。

TOP

  1. (echo TestStr&echo.)|findstr /o ".*">a.txt
复制代码
打开回显,一目了然。这句中之所以多出来一个空格,原因是预处理时语句被重组成“规范”的格式:
  1. (echo TestStr  & echo.)  | findstr /o ".*"
复制代码
做了如下一组实验:
  1. rem>nul 3>test.txt
  2. echo TestStr
  3. echo TestStr&echo.
  4. (echo TestStr&echo.)
  5. (echo TestStr&echo.)|findstr /o ".*"
  6. test.txt
复制代码
可见 echo TestStr 时,cmd 为其后缀一个仅在预处理中有效的空格,而 & 号又为自身前后添加一个空格。当管道中出现语块或者存在内部命令时,管道前的内容将作为参数交给新的 cmd 进程,此时原本只存在于预处理中的空格也许因为被新的 cmd 进程误认为是 echo 命令的参数而非分隔符显示出来。

TOP

回复 69# Hello123World


    因为回车换行占两个字符
1

评分人数

TOP

回复 3# 523066680
为什么要在原字节大小上减去2?难道默认字符还要多占去2个字节?

TOP

第一题不计算空格数:
  1. @echo off&SetLocal EnableDelayedExpansion
  2. Set str=i like the bathome,because here is the batch of the world.
  3. Set n=0
  4. Set str=%str: =%
  5. Set a=
  6. :loop
  7. Set a=!str:~%n%,1!
  8. if not "%a%"=="" (Set /a n+=1 & goto loop
  9. ) Else (echo !n!)
  10. pause>nul
复制代码

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p a=请输入一窜字符串:
  4. set m=0
  5. :xxw
  6. if not "!a:~%m%,1!"==""  set /a m=!m!+1&goto :xxw
  7. echo 有%m%个字符!!!!!!!!
  8. pause&goto :eof
复制代码

TOP

TOP

原帖由 netbenton 于 2009-4-29 11:54 发表
楼上的,等半天都算不出来,
其实set /p输入的行最大为1024字符,变量长度也只有8189 个字符,没必要1000000,

for /l 在预处理时会首先按数分配完后才一条条执行的,分配时也是要时间的,大概是80次等一个set a ...

1024?
奇怪了...为何我输入的最大数为1021的?

我是在下面试验得到1021这数字的,是那里的分别影响了结果?
望指教
@echo off
set/p str=
:lp
if defined str set str=%str:~1%&set/a l+=1&goto lp
echo %l%
pause>nul

[ 本帖最后由 Taurus 于 2009-11-14 17:44 编辑 ]
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

  1. rem 1.1 1.2字符串长度不限,可含特殊字符。
  2. @echo off &setlocal enabledelayedexpansion
  3. set /p str=Please input string:&set a=&set /a var=0
  4. :loop
  5.     set a=!str:~%var%,1!
  6.     set /a err=%errorlevel%
  7.     if !err! equ 0 (set /a var+=1&goto :loop )
  8.     set /a var-=1
  9. echo the length of string is:%var%
  10. pause>nul
复制代码

[ 本帖最后由 zgq0301 于 2009-11-14 09:07 编辑 ]

TOP

回复 60楼 的帖子

58楼的代码是修正楼主3楼的代码,不是我自己写的。

59楼的代码,你说的对,我多用了一个 set /a n+=1 做计数器,多此一举了。谢谢指正,在59楼修正。
(*^_^*)

TOP

re 61楼

多了两个吧,是回车和换行符,减2就可以了

TOP

返回列表