|
|
本帖最后由 pcl_test 于 2016-9-9 22:47 编辑
- @echo off
- Setlocal Enabledelayedexpansion
- set n=0
- for /f "delims=" %%i in (a.txt) do (
- set "ke=%%i"
- set ke1=!ke: =!
- set m=0
- call :1
- call echo %%ke1%%
- )
- echo %wang%
- pause
- goto :eof
- :1
- if not "!ke1:~%m%,1!"=="" set /a m+=1&goto 1
- if %m% gtr %n% set n=%m%&set wang=%ke%
- echo %m%
- goto :eof
复制代码 以上是浅默写的,也算是比较适合我这类新手更容易看懂的代码,在我自己写以及查看高手门代码的时候,遇到了很多不懂,也小有心得体会,所以我就发了这个帖子询问,因为论坛发贴规则,题目我就这样写了,也算是一个笔记吧
先写关于这个代码的我懂的:- for /f "delims=" %%i in (a.txt) do (
- set "ke=%%i"
- set ke1=!ke: =!
复制代码 这基本上可以算是一个替换字符的模本,看看这一句set %%i=!%%i: =!,echo %%i,会发现set完全没有作用。也就是说%%i这样的变量是不能直接进行字符串替换的,当然,也可以set ke=!ke: =!。ke只是一个名字而已,可以用其他字符替换,不过最好是有意义的,并且看的懂的。这里为什么是ke1而不是ke?下面再解释。
set m=0
if not "!ke1:~%m%,1!"=="" set /a m+=1&goto 1
这两句一定要放在一起来说,这两句代码是最简单的求字符串长度代码,原理后面会提到。如果只是求1段字符串长度的话,其实后面一句就可以了,只不过在这个程序里,他是要对每一行分别计算长度,有很多个不同的值,为什么要定义m=0?因为我们在计算第一行字符串长度后,需要把变量m初始化为0,才能正确的计算下面每行的长度,如果不初始化,那么在计算完第一行后,m将会被定义数x,如果第2行的字符串长度没有第一行多,而且如果字符数不为0的话,那么他就会简单的把x这个值赋予第2行的字符串长度m,但实际上没那么多。如果第3行比第1行多,那么第3行将能正确的取得,但是第4行如果又少了的话,那么第4行将会取得上1个循环的数,也就是第3行的数,以此类推。而且这个set m=0的位置非常讲究,如果放在for循环前,结果将会跟没定义一样,为什么?因为这个计算只是在循环内部计算,外部定义对内部没有起到作用,如果放在子代码段开头呢?将会发现程序进入了死循环,因为这段对每一行字符串长度进行计算的时候,他是先去掉第一个字符,如果剩下的字符不为空的话,m自加1为1,然后再计算剩下的字符,如果还不为空,那么m自加1为2,以此类推。如果你在子代码段开头设置set n=0,将会使m=0,而不是1,然后再进行计算,这样他永远就无法计算出来,从第一行开始就进入死循环。
set n=0
if %m% gtr %n% set n=%m%&set wang=%ke%
set ke1=!ke: =!
这里用set ke1=!ke: =!是因为题目要求,如果我们用set ke=!ke: =!的话,在代码执行到最后,ke的值是一行没有空格的字符串,我们输出(echo %wang%)时,得到的也就是一串没有空格的字符串,但是这里为什么会在程度段开头就设置n=0,并且在子代码段里对n跟m进行比较,并赋值呢?看代码的意思:如果字符串长度比n大,那么n就等于字符串长度,关键在于set wang=%ke%是怎样把字符串最长的行(带空格)赋予wang的呢?再来观察整个程序,就会小有发现,如果第1行的字符串长度比0大,那么wang就等于第1行字符串,如果后面的行都没有n(这里是第1行的的字符串长度)大,那么就不会对n进行再赋值,wang就没有变化。。。但是如果后面的值有比前面的大,那么就重新进行赋值,最后就能得出正确的结果
关键是最后的代码,想了我2天,才想明白,所以就发来,希望有不明白的可以看到,明白的就飘过算了,如有不对请指点指点。就像老师教编程的时候一样,说程序本身并不重要,重要的是思想
[ 本帖最后由 sgaizxt001 于 2010-2-6 04:14 编辑 ] |
评分
-
查看全部评分
|