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

【练习-016】批处理判断字符串长度

[复制链接]
发表于 2009-1-31 17:23:59 | 显示全部楼层
  1. :StrLen
  2. setlocal enableextensions
  3. set "str=a%~2"
  4. set "str=%str:"=s%"
  5. set "str=%str:^^=s%"
  6. set "str=!str:%%=s!"
  7. set /a strlength=0
  8. :StrLen_1
  9. set /a strlength+=1
  10. if not "!str:~%strlength%,1!"=="" goto StrLen_1
  11. endlocal&set /a "%~1=%strlength%-1"
  12. goto :EOF
复制代码


如果作为库函数的话,我觉得LS的代码不行,因为你不知道变量可能的长度,就把for设定在10000了,缺乏通用性

如果要完全通用的话,就要把10000改成2^31-1,就是2147483647

改完之后,执行时间就增长了。。。
发表于 2009-1-31 18:54:41 | 显示全部楼层
RE:  defanive兄
我前面这样处理 是因为 变量的的长度是有限制的  这个以前有讨论
执行时间  视变量长度  不是一直循环的 空值就退出啊
下面的代码  前面贴有的  我只是简化下  应该也可判断
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p str=Type :
  3. :lp
  4. if defined str (
  5.     set/a n+=1
  6.     set str=!str:~1!
  7.     goto lp
  8. )
  9. echo %n%
  10. pause
复制代码

评分

参与人数 1PB +2 收起 理由
523066680 + 2 表示同意

查看全部评分

发表于 2009-1-31 19:14:22 | 显示全部楼层
27楼代码 是否可简化下?
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p str=Type :
  3. :lp
  4. if not "!str:~%n%,1!"=="" set /a n+=1&goto lp
  5. echo;%n%
  6. pause
复制代码
发表于 2009-1-31 19:20:23 | 显示全部楼层
:StrLen
setlocal enableextensions
set "str=%~2"
:StrLen_1
if defined str (
        set/a n+=1
        set "str=%str:~1%"
        goto StrLen_1
)
endlocal&set "%~1=%n%"
goto :EOF

函数整理成这样了,同意么?
 楼主| 发表于 2009-1-31 19:42:56 | 显示全部楼层

回复 33楼 的帖子

defan是想用函数的形式做这个东西

标签是 :StrLen
用类似 call :StrLen "var" "字符串" 的形式调用
var是用来返回 字符串长度 的变量名

我小改一下就又出现麻烦了 还请 terse 指教一二。
发表于 2009-2-9 22:55:01 | 显示全部楼层
1-1

  1. @echo off
  2. set "a= i like the bathome,because here is the batch of the world."
  3. set /a num=0
  4. :loop
  5. set /a num+=1
  6. set a=%a:~1%
  7. if "%a%"=="" (goto :ne1) else goto :loop
  8. :ne1
  9. echo %num%
  10. pause
复制代码
发表于 2009-2-9 23:24:05 | 显示全部楼层

回复 34楼 的帖子

不能支持特殊字符的话,叫做函数是否不太好呢?
发表于 2009-4-14 17:26:14 | 显示全部楼层
看不懂哦,那个什么~:什么什么的,在那有详细的介绍。先谢谢了
发表于 2009-4-14 18:18:50 | 显示全部楼层

回复 38楼 的帖子

本论坛教学区搜索“set”
发表于 2009-4-14 19:42:04 | 显示全部楼层
原帖由 Batcher 于 2008-8-15 08:39 发表
1.1@echo off
set str=i like the bathome,because here is the batch of the world.
for /f "skip=1 delims=:" %%a in ('^(echo "%str%"^&echo.^)^|findstr /o ".*"') do set /a length=%%a-5
echo %length%


我不是很明白 set /a length=%%a-5,为什么减5,我见过减2的。能给解释一下吗?
发表于 2009-4-14 22:27:27 | 显示全部楼层

回复 40楼 的帖子

你能先解释一下为什么减2吗?
然后我再说说减5的原因。
发表于 2009-4-16 14:52:31 | 显示全部楼层

回复 41楼 的帖子

减2,是因为减去回车和换行
发表于 2009-4-16 15:07:59 | 显示全部楼层

回复 42楼 的帖子

开始
运行
cmd
分别运行下面两个命令
(echo "bathome"&echo.)|findstr /o ".*"
(echo bathome&echo.)|findstr /o ".*"
思考一下为什么减5?思考一下为什么减2是错的?
发表于 2009-4-18 23:00:32 | 显示全部楼层

回复 43楼 的帖子

我的意思不是说在这道题中减2,我只是在别的代码中见过减2的,这里减5是对的,我只是很不明白这个原理。

我把你说的这两个代码实验了
(echo "bathome"&echo.)|findstr /o ".*"
(echo bathome&echo.)|findstr /o ".*"
实验结果是:
0:"bathome"
12:

0:bathome
10:

我还是没明白什么原理。我只是发现你给的两种代码因为有 ""  号,而两个值不同了。
发表于 2009-4-18 23:15:18 | 显示全部楼层

回复 44楼 的帖子

能把你看到的减2的代码贴出来看看么,最好能够注明出处?然后我告诉你我的代码中减5的原理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 02:48 , Processed in 0.021582 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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