Board logo

标题: [文本处理] [已解决]批处理如何计算任意字符串的字符长度? [打印本页]

作者: DXSX    时间: 2009-8-26 17:51     标题: [已解决]批处理如何计算任意字符串的字符长度?

如题:比如 "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 编辑 ]
作者: pusofalse    时间: 2009-8-26 18:22

搜索
作者: batman    时间: 2009-8-26 19:21     标题: 折半法(渐近法)

  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
复制代码

作者: DXSX    时间: 2009-8-26 19:45     标题: 回复 3楼 的帖子

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

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

不错。
作者: DXSX    时间: 2009-8-26 20:07

借鉴 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 编辑 ]
作者: zqz0012005    时间: 2009-8-26 20:28

折半法完整版(兼容特殊字符)
http://www.bathome.net/viewthread.php?tid=4219
作者: DXSX    时间: 2009-8-26 23:19

原来是华罗庚的二分法,初中有听说过。当时举例子是判断一根电线的断点。
我们可以架设这根电线长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
作者: pine    时间: 2009-11-10 10:29

原帖由 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=" ...


能否文字注释一下,方便理解呢?折半法我一直没能理解过来,你这个例子相对其它的较好入手,请讲解下,谢谢
作者: keen    时间: 2009-11-10 12:40     标题: 回复 8楼 的帖子

可以去6楼给出的帖子中学习学习!
作者: keen    时间: 2009-11-10 12:51

其实要算任意字符串长度,还是用VBS中的LEN函数最方便。
作者: ithinkican    时间: 2011-1-13 01:36     标题: 不得不配服…

11楼代码太经典了……!
作者: wodesitanfu    时间: 2012-8-2 15:47

回复 12# ithinkican


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




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2