中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 发现一个得到字符串长度的方法
作者:
标题: 发现一个得到字符串长度的方法 取消高亮 | 上一主题 | 下一主题
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『楼 主』:  发现一个得到字符串长度的方法

命令如下:
(echo string&echo.)|findstr /o ".*"
批处理中应用:
set/p x=input:
for /f "skip=1 delims=:" %%i in ('^(echo "%x%"^&echo.^)^|findstr /o ".*"') do set/a l=%%i-5
echo %l%
pause
[ Last edited by everest79 on 2008-1-1 at 12:06 AM ]

   此帖被 +45 点积分       点击查看详情   
评分人:【 dikex 分数: +3  时间:2007-12-31 18:11
评分人:【 s11ss 分数: +4  时间:2007-12-31 18:19
评分人:【 fastslz 分数: +8  时间:2007-12-31 18:36
评分人:【 HAT 分数: +8  时间:2007-12-31 21:26
评分人:【 junchen2 分数: +4  时间:2007-12-31 23:49
评分人:【 huzixuan 分数: +8  时间:2008-1-1 20:01
评分人:【 zh159 分数: +10  时间:2008-1-7 13:59


2007-12-31 17:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 2 楼』:  

会产生临时文件:
echo string>t&for %a in (t) do set/a z=%~za-2&del t


2007-12-31 18:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 3 楼』:  

嗯,方法有很多,主要是刚发现findstr的/o参数作用,记得原来有个专门总结这个的贴子,找不到了

2007-12-31 18:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  

学习

发现字符串以重定向符号结束时代码会出错
只要把%x%加上双引号就行了



2007-12-31 21:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 5 楼』:  

已更正,嘿嘿,没多测试

2007-12-31 21:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ZJHJ
高级用户





积分 609
发帖 374
注册 2006-8-2
状态 离线
『第 6 楼』:  

请问一下:

为什么?

楼 主 的测试方法比实际的要多 2  ???

第 2 楼 的测试方法比实际的要少 2  ???

  参数 /a 有什么用????

2007-12-31 22:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 7 楼』:  

The /A switch specifies that the string to the right of the equal sign
is a numerical expression that is evaluated.  The expression evaluator
is pretty simple and supports the following operations, in decreasing
order of precedence:



2007-12-31 22:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 8 楼』:  

这个字符偏移好像是包括换行与回车还有什么的,所以在ansi文本中每行多两个字节,在内存中多三具
set /a 是表示后边的为数字表达式,你可以理解为四则运算

2008-1-1 00:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 9 楼』:  

我觉得多出来的那个3就是:行结束符、回车符、换行符。
不知道理解的对不对?



2008-1-1 12:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
erel
新手上路





积分 10
发帖 5
注册 2008-1-3
状态 离线
『第 10 楼』:  

新手学习中

2008-1-3 06:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
BatMan
初级用户

蝙蝠侠是写批处理的人



积分 54
发帖 24
注册 2008-1-4
状态 离线
『第 11 楼』:  

这个方法可以,但是我试了一下,发现这方法比逐个字符判断要慢很多...
SETLOCAL ENABLEDELAYEDEXPANSION
SET "TMPITEM=Hello World!"

:: FINDSTR /O法,添加了空判断以适应TMPITEM=空的情况
ECHO !TIME!
IF DEFINED TMPITEM (
        FOR /F "skip=1 delims=:" %%I IN ('^(echo "%TMPITEM%"^&echo.^)^|findstr /o ".*"') DO (
                        SET /A "TMPITEM_LEN = %%I - 4"
        )
) ELSE (
        SET "TMPITEM_LEN=0"
)
ECHO !TIME!
ECHO %TMPITEM_LEN%

:: 逐个字符计数法
SET "TMPITEM_LEN=0"
ECHO !TIME!
IF DEFINED TMPITEM (
        :GetLenLoop
        SET "TMPTMP=!TMPITEM:~%TMPITEM_LEN%,1!" && SET /A "TMPITEM_LEN += 1" && GOTO :GetLenLoop
)
ECHO !TIME!
ECHO !TMPITEM_LEN!

ENDLOCAL
FINDSTR /o 法在我的机器上一般要80~100ms,而逐个字符计数法一般是<10ms~20ms左右。可能是因为FINDSTR毕竟是外部命令调用的缘故吧。

[ Last edited by BatMan on 2008-1-7 at 03:04 AM ]

2008-1-7 02:43
查看资料  发送邮件  发短消息 网志  OICQ (25013672)  编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by BatMan at 2008-1-7 02:43:
这个方法可以,但是我试了一下,发现这方法比逐个字符判断要慢很多...

[code]
SETLOCAL ENABLEDELAYEDEXPANSION
SET "TMPITEM=Hello World!"

:: FINDSTR /O法 ...

FINDSTR /O 好处是可以判断双字节字符,在单双字节字符窗口中排版很有用



2008-1-7 10:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
BatMan
初级用户

蝙蝠侠是写批处理的人



积分 54
发帖 24
注册 2008-1-4
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by zh159 at 2008-1-7 10:17:

FINDSTR /O 好处是可以判断双字节字符,在单双字节字符窗口中排版很有用

原来如此...

我用"世界你好Hello World!"来测试,FINDSTR /O报的是字节数,而逐字符计算则得到字符数,明白楼上的意思了。

但是发现个新问题...如果测试字符串稍改为"世界你好!Hello World!",则Hello World前后的!号在变量延迟扩展时会被视作特殊符号而导致最终结果错误。用%号也会有类似的情况。这问题有解决方案吗?

2008-1-7 13:47
查看资料  发送邮件  发短消息 网志  OICQ (25013672)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: