标题: [文本处理] [已解决]批处理如何计算任意字符串的字符长度? [打印本页]
作者: 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 标题: 折半法(渐近法)
- @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=" %%b in ("!num!") do if "!str:~%%b!" equ "" (set /a max=num) else set /a min=num
- )
- if "!str:~%num%!" neq "" set /a num+=1
- echo 经计算字符串str共有%num%个字符
- 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 |