[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  1. :StrLen
  2. setlocal enableextensions
  3. set "str=a%~2"
  4. set "str=%str:"=s%"
  5. set "str=%str:^^=s%"
  6. set "str=!str:%%=s!"
  7. set /a strlength=0
  8. :StrLen_1
  9. set /a strlength+=1
  10. if not "!str:~%strlength%,1!"=="" goto StrLen_1
  11. endlocal&set /a "%~1=%strlength%-1"
  12. goto :EOF
复制代码


如果作为库函数的话,我觉得LS的代码不行,因为你不知道变量可能的长度,就把for设定在10000了,缺乏通用性

如果要完全通用的话,就要把10000改成2^31-1,就是2147483647

改完之后,执行时间就增长了。。。

TOP

直接点的怎么样呢
  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
复制代码
1

评分人数

    • 523066680: 上次 权限不够 这次一起加。PB + 16

TOP

我的代码测试成功灭?

没什么要拓展的就入库了?

TOP

对%的麻烦感到如此无奈 ~  我们老是对自己的代码提出要求
由于批处理本身的限制 咱是不是也对使用者提提要求?

例如
1.如果遇到敏感字符 请用别的字符代替~(咔咔   我怎么能这样想呢? 无奈~)

TOP

作为一个随时调用的函数,你不可能修改批处理,这样实在无爱。。。

还是要作为传值参数一样,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

TOP

defanve发起项目  关系到字符串处理  俺又回到这个帖子
还有余兴 继续讨论。 (不禁难过 我22楼的东西咋这么粗糙~ 哎 )

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

处理中……

[ 本帖最后由 523066680 于 2009-1-31 13:22 编辑 ]

TOP

哈哈,改进一下,大家看
@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 编辑 ]

TOP

哈哈 我说了是偏方嘛  就是搞个思路而已。


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

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

[ 本帖最后由 523066680 于 2008-8-19 08:01 编辑 ]

TOP

回复 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!
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

习题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

TOP

原帖由 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  也一样

TOP

我觉得上面的方法高明~!不过我通过在命令行输入 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 编辑 ]

TOP

少个出错几率
  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
复制代码
1

评分人数

TOP

这是我最初的解,只能就题解题而已。
  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 编辑 ]
心绪平和,眼藏静谧。

TOP

含特殊字符的字符串赋值让我很头痛,batman版主的方法也不错,是我以前所不知道,学习了。其思路也让我看了代码好久,才知奧妙所在。

TOP

返回列表