返回列表 发帖
我还是看看别人的吧,我太菜了

TOP

回复 4楼 的帖子

法四中
for /f "tokens=1 delims=:" %%i in ('findstr /o .* a.txt') do set /a length=%%i-2&if not %%i  equ 0 echo 共有%length%个字符&goto end
应该是一行,估计网页原因,显示为两行,所以我觉得是不是%length% 改为!length!
如不对,请指正!
(*^_^*)

TOP

@echo off
set str=123ABC上中下
set /a n=0
:loop
set str=%str:~0,-1%
if  "%str%" neq "" (set /a n+=1 & goto loop)
echo 这个字符串是%n%位数 & pause>nulCOPY

TOP

回复 12# batman
@echo off
set n=12345689
set n=%n%;
for /f "tokens=1 delims=:" %%1 in ('^(echo %n:;=^&echo.%^)^|findstr  /o ".*"')do set /a c=%%1-3
echo %c%
pauseCOPY
不用临时文件

TOP

@echo off
set str=123ABC上中下
:loop
set /a a+=1
set str=%str:~0,-1%
if "%str%"=="" (echo %a%&pause>nul ) else goto loopCOPY

TOP

本帖最后由 taofan712 于 2017-3-10 16:26 编辑
@echo off
set "var=qwertyuioplkjhgfdsazxcvbnm"
call :strLen var long
echo;%long%
pause&exit /b
:strLen
(   SETLOCAL ENABLEDELAYEDEXPANSION
    set "str=A!%~1!"
    set "len=0"
    for /L %%A in (12,-1,0) do (
        set /a "len|=1<<%%A"
        for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"
    )
)
( ENDLOCAL
    IF "%~2" NEQ "" SET /a %~2=%len%
)
goto :eofCOPY
很偏门,但很好用,不忍独享,文件出处http://www.it1352.com/328587.html

TOP

回复 21# taofan712

最好标明出处,方便看到的朋友系统学习。如果是你没记出处,就是你的问题了。
http://www.bathome.net/thread-11799-1-1.html
结合帖子中设置为一个变量调用的思路,也试着把这种方式写成一行试试
@echo off & setlocal enabledelayedexpansion
set "_strlen=set $=#^!$^!&set ##=&for /l %%a in (12,-1,0)do set/a"##^|^=1^<^<%%a"&for %%b in (^!##^!)do if ^!$:~%%b^!.==. set /a"##^&^=~1^<^<%%a""
for %%i in (
12345678901234567890123456789012345678901234567890
1234567890123456789012345678901234567890
123456789012345678901234567890
12345678901234567890
1234567890
1
) do (
set "$=%%i" & (%_strlen%)
echo;!##! : %%i
)
pause & exit /bCOPY
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

参变量的最少个数为1,最少循环次数也为1,思路清晰了,也挺好写的

TOP

本帖最后由 老刘1号 于 2017-5-14 14:57 编辑

8086ASM(DEBUG版)
Echo off&CLS
IF /i "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" (
echo DEBUG和8086_ASM不支持64位的系统。
Pause&Exit
)
>"%Tmp%\DEBUGASM.TMP" (
Echo A
Echo MOV BX,20 ;一段安全的空间
Echo MOV SS,BX
Echo MOV SP,80 ;清理安全空间
Echo MOV CX,40 ;循环次数(HEX)=清理字节数(128B)/入栈大小(2B)
Echo SUB BX,BX ;清空BX
Echo PUSH BX ;执行入栈(清理)
Echo LOOP 10D ;循环压栈
Echo SUB CX,CX ;清空CX
Echo INT 21H
Echo.&Echo G)
Set /P str=Input a string:
Echo E20:0 "%STR%">>"%Tmp%\DEBUGASM.TMP"
More +25 "%~0" >>"%Tmp%\DEBUGASM.TMP"
For /f "Tokens=2" %%a in (
'^<%tmp%\DEBUGASM.TMP DEBUG^|Findstr /c:"0020:0000"'
) Do Set /a Strlen=0x%%a
DEL %tmp%\DEBUGASM.TMP
Echo %Strlen%&Pause&Exit /b
A100
MOV BX,20 ;一段安全的空间
MOV DS,BX
SUB BX,BX ;清空BX
MOV CL,[BX] ;获取Ascii
JCXZ 10E ;判断是否为NUL并跳出
INC BX ;计数
JMP 107 ;循环读取
MOV [0],BX ;将字符串长度写入内存
INT 21H
G
D20:0 0
Q
QCOPY
1

评分人数

TOP

回复 24# 老刘1号
超过65个字符就不行。

TOP

回复 25# happy886rr


    峰值为71个
DEBUG一行就那么长...

TOP

回复 26# 老刘1号
很棒,71个够用了,一般太长的都直接C语言解决。

TOP

回复 27# happy886rr


    感谢鼓励,
新版本出炉,峰值达到255个
用法: Batname <String>
继续学习汇编~~
@Echo off
IF /i "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" (
echo DEBUG和8086_ASM不支持64位的系统。
Pause&Exit
)
Set "Str=%*"
>%tmp%\DEBUGASM.TMP (
ECHO A20:0
ECHO DB "%Str:~,70%"
ECHO DB "%Str:~70,70%"
ECHO DB "%Str:~140,70%"
ECHO DB "%Str:~210,45%"
ECHO DB 0
ECHO.
MORE +20 "%~0"
)
For /f "Tokens=2" %%a in (
'^<%tmp%\DEBUGASM.TMP DEBUG^|Findstr /c:"0020:0000"'
) Do Set /a Strlen=0x%%a 2>nul
Echo %Strlen%&DEL /F %tmp%\DEBUGASM.TMP&Exit /b
A100
MOV BX,20 ;一段安全的空间
MOV DS,BX
SUB BX,BX ;清空BX
MOV CL,[BX] ;获取Ascii
JCXZ 10E ;判断是否为NUL并跳出
INC BX ;计数
JMP 107 ;循环读取
MOV [0],BX ;将字符串长度写入内存
INT 21H
G
D20:0 0
Q
老刘制作~COPY
1

评分人数

TOP

回复 28# 老刘1号
255个已经够用了。再长的批处理自己也能计算。

TOP

@echo off
setlocal enabledelayedexpansion
::%1  字符串
set str=%1
set strLen=0
:StartLoop
if  "%str%"==""  goto EndLoop
set str=!str:~1!
set /a strLen+=1
goto StartLoop
:EndLoop
echo %1 length is !strLen!COPY

TOP

返回列表