找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 32261|回复: 12

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

[复制链接]
发表于 2009-8-26 17:51:20 | 显示全部楼层 |阅读模式
如题:比如 "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 编辑 ]
发表于 2009-8-26 18:22:07 | 显示全部楼层
搜索
发表于 2009-8-26 19:21:31 | 显示全部楼层

折半法(渐近法)

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

评分

参与人数 1PB +10 收起 理由
pusofalse + 10

查看全部评分

 楼主| 发表于 2009-8-26 19:45:13 | 显示全部楼层

回复 3楼 的帖子

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

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

不错。
 楼主| 发表于 2009-8-26 20:07:09 | 显示全部楼层
借鉴 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 编辑 ]
发表于 2009-8-26 20:28:25 | 显示全部楼层
折半法完整版(兼容特殊字符)
http://www.bathome.net/viewthread.php?tid=4219
 楼主| 发表于 2009-8-26 23:19:34 | 显示全部楼层
原来是华罗庚的二分法,初中有听说过。当时举例子是判断一根电线的断点。
我们可以架设这根电线长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
发表于 2009-11-10 10:29:20 | 显示全部楼层
原帖由 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=" ...


能否文字注释一下,方便理解呢?折半法我一直没能理解过来,你这个例子相对其它的较好入手,请讲解下,谢谢
发表于 2009-11-10 12:40:33 | 显示全部楼层

回复 8楼 的帖子

可以去6楼给出的帖子中学习学习!
发表于 2009-11-10 12:51:57 | 显示全部楼层
其实要算任意字符串长度,还是用VBS中的LEN函数最方便。
发表于 2011-1-13 01:36:29 | 显示全部楼层

不得不配服…

11楼代码太经典了……!
发表于 2012-8-2 15:47:14 | 显示全部楼层
回复 12# ithinkican


    学C学的时候,这种最基础算法必学,不过,用到批处理,倒是第一次看到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 15:15 , Processed in 0.021660 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表