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

[文本处理] [已解决]批处理如何计算任意字符串的字符长度?

如题:比如 "ABCDEFGHIJ   AGFD  FAS  DFDS"  引号中包含字母和空格的一个字符串,如何编辑批处理计算出其长度?


T.CMD 内容如下: 运行 T.CMD "ABC DEF GHI " 就可以得到引号中字符串的长度
-------------------------------------
@ECHO OFF
IF %1*==* GOTO :EOF
ECHO %1
SET ABC=%~1
SET /A N=0
OOP
SET ABC=%ABC:~0,-1%
SET /A N=%N%+1
IF "%ABC%" EQU "" GOTO END
GOTO LOOP
:END
ECHO %N%
PAUSE

上面这个现成的总觉得罗索。诸位老大有没有更简洁的方法阿?

[ 本帖最后由 DXSX 于 2009-8-26 17:52 编辑 ]

搜索
心绪平和,眼藏静谧。

TOP

折半法(渐近法)

  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=afdjg do men contgfirfmck     song putint"
  3. set /a max=8190,min=0
  4. for /l %%a in (1,1,14) do (
  5.      set /a "num=(max+min)/2"
  6.      for /f "delims=" %%b in ("!num!") do if "!str:~%%b!" equ "" (set /a max=num) else set /a min=num
  7. )
  8. if "!str:~%num%!" neq "" set /a num+=1
  9. echo 经计算字符串str共有%num%个字符
  10. pause>nul
复制代码
1

评分人数

***共同提高***

TOP

回复 3楼 的帖子

学习了,原来是通过逐步缩小 判断范围。 好像中央2 购物街 节目的判断商品价格的方法。呵呵。

多次喊出价格,与真实价格比高低,确定真实价格所在的范围。不断喊价缩小范围直到最终得到正确答案。

不错。

TOP

借鉴 3楼 FOR 的方法 可以避免 变量嵌套误会的问题。

@ECHO OFF & setlocal enabledelayedexpansion
ECHO %1
SET NAME=%~1
SET /A M=0
OOP
SET /A M=%M%+1
FOR /F "DELIMS=" %%C IN ("!M!") DO IF "!NAME:~%%C,1!" EQU ""  GOTO END
GOTO LOOP
:END
ECHO %M% 个字符。
PAUSE

[ 本帖最后由 DXSX 于 2009-8-26 20:08 编辑 ]

TOP

折半法完整版(兼容特殊字符)
http://www.bathome.net/viewthread.php?tid=4219
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

原来是华罗庚的二分法,初中有听说过。当时举例子是判断一根电线的断点。
我们可以架设这根电线长8190, 字符串长度就是断点。呵呵。

@ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION
IF %1*==* GOTO :EOF
ECHO 计算 %1 的长度
SET L=%~1
SET X=0
IF "%L%"=="" GOTO END
ECHO 假设这个变量最长为 8190,二分法判断序列如下:
SET /A N=0,M=8190
FOR /L %%C IN (1,1,14) DO (
  SET /A X0=%X%
  SET /A "X=(!M!+!N!)/2"
  ECHO !X!;若小则!X!~!M!;若大则!N!~!X!。
  FOR /F %%D IN ("!X!") DO  IF "!L:~%%D!" EQU "" (SET /A M=!X! ) ELSE (SET /A N=!X!)
)
:END
SET /A X+=1
ECHO.
ECHO.
ECHO 计算结果为%X%字符  &PAUSE

TOP

原帖由 batman 于 2009-8-26 19:21 发表
@echo off&setlocal enabledelayedexpansion
set "str=afdjg do men contgfirfmck     song putint"
set /a max=8190,min=0
for /l %%a in (1,1,14) do (
     set /a "num=(max+min)/2"
     for /f "delims=" ...


能否文字注释一下,方便理解呢?折半法我一直没能理解过来,你这个例子相对其它的较好入手,请讲解下,谢谢

TOP

回复 8楼 的帖子

可以去6楼给出的帖子中学习学习!
(*^_^*)

TOP

其实要算任意字符串长度,还是用VBS中的LEN函数最方便。
(*^_^*)

TOP

不得不配服…

11楼代码太经典了……!

TOP

回复 12# ithinkican


    学C学的时候,这种最基础算法必学,不过,用到批处理,倒是第一次看到

TOP

返回列表