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

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

[复制链接]
发表于 2009-5-11 23:24:28 | 显示全部楼层

回复 60楼 的帖子

你决定这个能得到正确结果?
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Test>type test.bat
@echo off
echo BatHome>x.x
for %%a in (x.x) do echo %%~za

C:\Test>test.bat
9
发表于 2009-5-11 23:27:49 | 显示全部楼层

re 61楼

多了两个吧,是回车和换行符,减2就可以了
发表于 2009-5-11 23:37:35 | 显示全部楼层

回复 60楼 的帖子

58楼的代码是修正楼主3楼的代码,不是我自己写的。

59楼的代码,你说的对,我多用了一个 set /a n+=1 做计数器,多此一举了。谢谢指正,在59楼修正。
发表于 2009-11-13 21:59:19 | 显示全部楼层
  1. rem 1.1 1.2字符串长度不限,可含特殊字符。
  2. @echo off &setlocal enabledelayedexpansion
  3. set /p str=Please input string:&set a=&set /a var=0
  4. :loop
  5.     set a=!str:~%var%,1!
  6.     set /a err=%errorlevel%
  7.     if !err! equ 0 (set /a var+=1&goto :loop )
  8.     set /a var-=1
  9. echo the length of string is:%var%
  10. pause>nul
复制代码

[ 本帖最后由 zgq0301 于 2009-11-14 09:07 编辑 ]
发表于 2009-11-14 17:41:52 | 显示全部楼层
原帖由 netbenton 于 2009-4-29 11:54 发表
楼上的,等半天都算不出来,
其实set /p输入的行最大为1024字符,变量长度也只有8189 个字符,没必要1000000,

for /l 在预处理时会首先按数分配完后才一条条执行的,分配时也是要时间的,大概是80次等一个set a ...

1024?
奇怪了...为何我输入的最大数为1021的?

我是在下面试验得到1021这数字的,是那里的分别影响了结果?
望指教
@echo off
set/p str=
:lp
if defined str set str=%str:~1%&set/a l+=1&goto lp
echo %l%
pause>nul

[ 本帖最后由 Taurus 于 2009-11-14 17:44 编辑 ]
发表于 2009-12-11 18:23:54 | 显示全部楼层
发表于 2010-10-2 23:11:18 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p a=请输入一窜字符串:
  4. set m=0
  5. :xxw
  6. if not "!a:~%m%,1!"==""  set /a m=!m!+1&goto :xxw
  7. echo 有%m%个字符!!!!!!!!
  8. pause&goto :eof
复制代码
发表于 2011-8-3 15:00:15 | 显示全部楼层
第一题不计算空格数:
  1. @echo off&SetLocal EnableDelayedExpansion
  2. Set str=i like the bathome,because here is the batch of the world.
  3. Set n=0
  4. Set str=%str: =%
  5. Set a=
  6. :loop
  7. Set a=!str:~%n%,1!
  8. if not "%a%"=="" (Set /a n+=1 & goto loop
  9.         ) Else (echo !n!)
  10. pause>nul
复制代码
发表于 2011-8-3 15:14:00 | 显示全部楼层
回复 3# 523066680
为什么要在原字节大小上减去2?难道默认字符还要多占去2个字节?
发表于 2011-8-3 18:09:17 | 显示全部楼层
回复 69# Hello123World


    因为回车换行占两个字符

评分

参与人数 1技术 +1 收起 理由
Hello123World + 1 乐于助人

查看全部评分

发表于 2011-8-3 18:31:30 | 显示全部楼层
  1. (echo TestStr&echo.)|findstr /o ".*">a.txt
复制代码
打开回显,一目了然。这句中之所以多出来一个空格,原因是预处理时语句被重组成“规范”的格式:
  1. (echo TestStr  & echo.)  | findstr /o ".*"
复制代码
做了如下一组实验:
  1. rem>nul 3>test.txt
  2. echo TestStr
  3. echo TestStr&echo.
  4. (echo TestStr&echo.)
  5. (echo TestStr&echo.)|findstr /o ".*"
  6. test.txt
复制代码
可见 echo TestStr 时,cmd 为其后缀一个仅在预处理中有效的空格,而 & 号又为自身前后添加一个空格。当管道中出现语块或者存在内部命令时,管道前的内容将作为参数交给新的 cmd 进程,此时原本只存在于预处理中的空格也许因为被新的 cmd 进程误认为是 echo 命令的参数而非分隔符显示出来。
发表于 2011-8-4 12:21:42 | 显示全部楼层
回复 70# CrLf
可是那个字符串哪里回车换行了,哦,预处理默认echo后回车换行。
发表于 2021-4-18 15:32:07 | 显示全部楼层
这一道题目牵出很多故事,太精彩了,真是受益匪浅。
发表于 2021-4-18 15:39:19 | 显示全部楼层
习题1.2中,如果字符串中加一个单%,有些代码就可能失效。
发表于 2021-9-24 16:47:17 | 显示全部楼层

  1. :%%a%%!ver!&^^^ ^*~                     are you o                 k ?" : \  / ` `  verfdxcweippo opj x ds gw !%%
  2. ::将字符串放于第一行,并加上:
  3. @echo off & setlocal EnableDelayedExpansion
  4. set /p str=<%0
  5. :count
  6. set str=!str:~1!
  7. if defined str ( set /a n+=1 & goto :count )
  8. echo %n%
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 01:39 , Processed in 0.016935 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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