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

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

[复制链接]
发表于 2008-8-15 20:01:36 | 显示全部楼层
很有研究的说,很热闹。
发表于 2008-8-15 21:11:01 | 显示全部楼层
含特殊字符的字符串赋值让我很头痛,batman版主的方法也不错,是我以前所不知道,学习了。其思路也让我看了代码好久,才知奧妙所在。
发表于 2008-8-16 07:34:11 | 显示全部楼层
这是我最初的解,只能就题解题而已。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=i like the bathome,because here is the batch of the world. "
  3. call :loop
  4. endlocal
  5. set "str=%%a%%!ver!&^^^ ^*~                     are you o                 k ?" : \  / ` `  verfdxcweippo opj x ds gw !%%"
  6. setlocal enabledelayedexpansion
  7. set "str=!str:%%=%%%%!"
  8. :loop
  9. if defined str set/a n+=1&set "str=!str:~1!"&goto loop
  10. echo %n%
  11. pause>nul
复制代码
shqf的方法高明,放于自身批处理中。

[ 本帖最后由 pusofalse 于 2008-8-16 08:01 编辑 ]
发表于 2008-8-16 12:15:07 | 显示全部楼层
少个出错几率
  1. @echo off
  2. rem &<>%%a%%!ver!&^^^ ^*~                     are you o                 k ?" : \  / ` `  verfdxcweippo opj x ds gw !%%
  3. for /f "skip=1 delims=" %%i in (%~0) do set "str=%%i"&goto lp
  4. :lp
  5.     setlocal enabledelayedexpansion
  6.     set str=!str!
  7.     for /l %%i in (1,1,255) do if "!str:~%%i,1!"=="" set/a n=%%i-4&echo !n!&pause
复制代码

评分

参与人数 1PB +2 收起 理由
523066680 + 2

查看全部评分

 楼主| 发表于 2008-8-17 08:07:49 | 显示全部楼层
我觉得上面的方法高明~!不过我通过在命令行输入 yourbat.bat
才执行成功……
稍微改了一下……
@echo off
rem &<>%%a%%!ver!&^^^ ^*~                     are you o                 k ?" : \  / ` `  verfdxcweippo opj x ds gw !%%
for /f "skip=1 delims=" %%i in ('type %0') do set "str=%%i"&goto lp
:lp
    setlocal enabledelayedexpansion
    set str=!str!
    for /l %%i in (1,1,255) do if "!str:~%%i!"=="" set/a n=%%i-4&echo !n!&pause



-------------------------我又试了一下-----------------------------
  1. @echo off
  2. ::&<>%%a%%!ver!&^^^ ^*~                     are you o                 k ?" : \  / ` `  verfdxcweippo opj x ds gw !%%
  3. for /f "skip=1 delims=" %%i in ('type %0') do set "str=%%i"&goto lp
  4. :lp
  5.     setlocal enabledelayedexpansion
  6.     for /l %%i in (1,1,255) do if "!str:~%%i!"=="" set/a n=%%i-2&echo !n!&pause&exit
复制代码
少了一句set str=!str!但执行结果一样
在前面的代码中,这一句是否起着一些作用

[ 本帖最后由 523066680 于 2009-1-31 14:04 编辑 ]
发表于 2008-8-18 01:42:16 | 显示全部楼层
原帖由 523066680 于 2008-8-17 08:07 发表
我觉得上面的方法高明~!不过我通过在命令行输入 yourbat.bat
才执行成功……
稍微改了一下……
@echo off
rem &%%a%%!ver!&^^^ ^*~                     are you o                 k ?" : \  / ` `  verfdxcwe ...

确实应该 type %0   因为文件名空格问题  谢523066680兄的细心
set str=!str! 多余
我在前面就已经粗心了   开始我以为是前面是计算整个一排的 所以我改一下的
现在看前面::等同REM   如是这样  set /p str=<%0  也一样
 楼主| 发表于 2008-8-18 17:57:51 | 显示全部楼层
习题1.1我才搞出一个偏方,哈哈,大家看下 (貌似有些吃力不讨好)
@echo off
setlocal enabledelayedexpansion
set no1=i like the bathome,because here is the batch of the world.
set code=a1a2a3a4a5a6a7a8a9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
set code2=abababababababababababababababababababababababababababababababababababababababab
    set no2=%no1%%code2%
    set no3=%no1%%code%
    set no2=%no2:~0,80%
    set no3=%no3:~0,80%
    if "%no2:~-1%"=="a" (
      set n=%no3:~-3,2% &set n=!n:a=!
      set /a no4=80-!n!*2-1
      echo !no4!
      ) else (
        set n=%no3:~-2% &set n=!n:a=!
        set /a no4=80-!n!*2
        echo !no4!
        )
pause
发表于 2008-8-18 19:21:15 | 显示全部楼层

回复 22楼 的帖子

这样是不是简单些?
  1. @echo off
  2. set str=i like the bathome,because here is the batch of the world.
  3. set length=0
  4. setlocal enabledelayedexpansion
  5. for /l %%a in (0,1,80) do (
  6.   if "!str:~%%a,1!" neq "" (
  7.     set /a length+=1
  8.   ) else (
  9.     goto :show
  10.   )
  11. )
  12. goto :eof
  13. :show
  14. echo !length!
复制代码
 楼主| 发表于 2008-8-18 20:39:47 | 显示全部楼层
哈哈 我说了是偏方嘛  就是搞个思路而已。


22楼的代码虽长,但只用9次set命令(前面7次,if选择其中一个-两次) 上面set很长的变量也是为了铺垫

如果要短,那当然还是其他代码啦,
像 楼上大家做习题1.2的代码就非常短而精悍。

[ 本帖最后由 523066680 于 2008-8-19 08:01 编辑 ]
 楼主| 发表于 2008-8-19 07:52:00 | 显示全部楼层
哈哈,改进一下,大家看
@echo off
set no1=i like the bathome,because here is the batch of the world.
set code1=%no1%1010101010101010101010101010101010101010101010101010101010101010101010101010101010
set code2=%no1%a1a2a3a4a5a6a7a8a91011121314151617181920212223242526272829303132333435363738394041
    set no2=%code2:~0,82%
    call,set /a num=-%code1:~81,1%-2
    call,set num=%%no2:~%num%,2%%
set /a n=82-%num:a=%*2-%code1:~81,1%
echo %n%
pause
使用了7句set,可测量最大为80个字符,不包括中文,特殊字符……

[ 本帖最后由 523066680 于 2008-8-19 08:19 编辑 ]
 楼主| 发表于 2009-1-31 13:14:37 | 显示全部楼层
defanve发起项目  关系到字符串处理  俺又回到这个帖子
还有余兴 继续讨论。 (不禁难过 我22楼的东西咋这么粗糙~ 哎 )

    应该说terse19楼的代码是各答案中比较完善的一个。
咱现在要想办法把它升级一下。
    1.找漏洞,当字符串最后一个是 ^ 符号的时候 导致分行语句连接
执行错误,这是个麻烦事儿。
    2.局限, skip=1 ::字符串必须放在第二行。
    3.升级  字符串个数不限

处理中……

[ 本帖最后由 523066680 于 2009-1-31 13:22 编辑 ]
发表于 2009-1-31 13:20:21 | 显示全部楼层
作为一个随时调用的函数,你不可能修改批处理,这样实在无爱。。。

还是要作为传值参数一样,call的时候给值,然后标签里%1使用。。。

另外,我那个函数应该是可以的,你再看看:

@echo off
setlocal enabledelayedexpansion
:loop
set /p a=Type :
call :StrLen "vl" "%a%"
echo Length : %vl%
pause>nul
goto loop
:StrLen
setlocal enableextensions
set "str=a%~2"
set "str=%str:"=s%"
set "str=%str:^^=s%"
set "str=!str:%%=s!"
set /a strlength=0
:StrLen_1
set /a strlength+=1
if not "!str:~%strlength%,1!"=="" goto StrLen_1
endlocal&set /a "%~1=%strlength%-1"
goto :EOF
 楼主| 发表于 2009-1-31 14:34:01 | 显示全部楼层
对%的麻烦感到如此无奈 ~  我们老是对自己的代码提出要求
由于批处理本身的限制 咱是不是也对使用者提提要求?

例如
1.如果遇到敏感字符 请用别的字符代替~(咔咔   我怎么能这样想呢? 无奈~)
发表于 2009-1-31 16:13:32 | 显示全部楼层
我的代码测试成功灭?

没什么要拓展的就入库了?
发表于 2009-1-31 16:35:37 | 显示全部楼层
直接点的怎么样呢
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p str=Type :
  3. for /l %%i in (1,1,10000) do if "!str:~%%i,1!"=="" echo %%i&pause&exit
复制代码

评分

参与人数 1PB +16 收起 理由
523066680 + 16 上次 权限不够 这次一起加。

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:29 , Processed in 0.030571 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表