Board logo

标题: [讨论][NT]计算字符串长度批处理代码查错 [打印本页]

作者: 3742668     时间: 2006-3-30 12:07    标题: [讨论][NT]计算字符串长度批处理代码查错


@echo off
:began
set /p mystr=输入要计算长度的字符串:
echo %mystr:~0,1% | findstr /i "q" 1>nul 2>nul && exit  rem 输入q退出

call :bflen "%mystr%"       rem 这两句调用bflen,返回长度到变量ret中。
echo 字符串:        "%mystr%"
echo 长  度:        %ret%

goto began

:bflen        rem 真麻烦,初始化要单独拿出来。
set num=
set str=
set ret=
set str=%1
:len          rem 计算字符串长度
set str=%str:~0,-1%
set /a num = %num% + 1
if defined str goto len
set /a ret = %num% - 2
set num=
goto :eof
请帮忙测试一下bflen以后有什么漏洞,或者优化改进一下。
本来准备自己测试的,不过想想人多力量大,而且刚好willsort也在,所以就贴出来请大家帮忙看看。主要用途是获取字符串长度,从标号bflen开始,如果测试成功以后在批处理中就可以直接引用而不用再花时间去写了。

[ Last edited by willsort on 2006-5-22 at 12:37 ]
作者: willsort     时间: 2006-3-30 15:24
Re 3742668:

      程序的退出语句有些缺陷,会导致以q起始的所有字符串均无法测得长度。另外,感觉取串长的算法效率有些低,最初改用echo串至文件再取文件长度的算法[1]。但是它也存在无法测出某些含有特殊字符串长的兼容性问题,所以改成现在的算法[2]。

测试案例:
   command
   command>nul
   "command>nul"
   command"com
@echo off & setlocal EnableExtensions
:began
set mystr=
set /p mystr=输入要计算长度的字符串(直接回车退出):
if not defined mystr goto :eof
call :strlen
echo 字符串:  "%mystr%"
echo 长  度:  %strlen%
goto began

:strlen          rem 计算字符串长度
set strlen=
echo "%mystr%">_strlen.tmp
for %%f in (_strlen.tmp) do set strlen=%%~zf
set /a strlen=strlen-4
goto :eof

@echo off & setlocal EnableDelayedExpansion
:began
set mystr=
set /p mystr=输入要计算长度的字符串(直接回车退出):
if not defined mystr goto :eof
for /l %%i in (0,1,1000) do if "!mystr:~%%i,1!"=="" set strlen=%%i && goto :_endfor
:_endfor
::echo 字符串:  "%mystr%"
echo 长  度:  %strlen%
set strlen=
goto began

作者: 3742668     时间: 2006-3-30 16:44
先谢了
不过可能是我没说清楚,我的本意是把取字符串长度的那部分做成一个类似函数的东东,然后在别的批处理中可以直接拷贝后调用。呵呵,积累多了以后也好偷懒。
如果我现在另外写个批处理的话我就可以直接把我的bflen标号以后的语句直接拷贝过去然后用call调用。
作者: yardian     时间: 2006-12-17 05:53
二楼的代码2每次都要算1000次,效率太慢了啊?
作者: namejm     时间: 2006-12-17 07:29
  不会的,只会执行字符串长度数的次数就跳出来了,请注意  && goto :_endfor 这一句。
作者: zzs162     时间: 2007-2-18 20:30
收藏嘻嘻
作者: skyearth     时间: 2007-3-2 00:35
代码2也有问题,如果包括中文也只视为1个字节
作者: slore     时间: 2007-3-2 00:40


  Quote:
Originally posted by skyearth at 2007-3-1 11:35:
代码2也有问题,如果包括中文也只视为1个字节

这个单纯只的是位数。

vbs直接len(str)……方便
作者: slore     时间: 2007-3-2 00:43
最大的bug是只能单行。
作者: skyearth     时间: 2007-3-3 03:20
可能没描述清楚,我是想判断“中英文字符混排”时,用BAT如何得到实际的字节位数,比如:“这是一个test”,如果用代码一,其结果12就是正确的结果,而代码二,其结果就是8,与实际的字节数不一致,这只是字数。

我是在做一个可在原地显示进度信息的脚本,由于汉字的长度不能正确计算,因此,其退格的长度就不好控制,请理解。