[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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. @echo off
  2. echo,i like the bathome,because here is the batch of the world.>x.x
  3. for /f "tokens=*" %%a in ('dir x.x /-c ^|find " 字节" ^|find /v ":"') do (
  4. for /f "tokens=3" %%b in ('echo,%%a') do (
  5. set /a n=%%b-2
  6. call echo %%n%%
  7. del x.x
  8. )
  9. )
  10. pause>nul
复制代码

[ 本帖最后由 523066680 于 2008-8-14 09:06 编辑 ]
1

评分人数

TOP

哈 又学到了东西 感谢前辈们!

[ 本帖最后由 523066680 于 2008-8-15 09:26 编辑 ]

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.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

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


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

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

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

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

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

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

处理中……

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

TOP

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

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

TOP

回复 33楼 的帖子

defan是想用函数的形式做这个东西

标签是 :StrLen
用类似 call :StrLen "var" "字符串" 的形式调用
var是用来返回 字符串长度 的变量名

我小改一下就又出现麻烦了 还请 terse 指教一二。

TOP

返回列表