我想找到一种方法来了解变量中的位数。现在,我正在尝试使用此代码。在此示例中,%var%是我需要知道它具有的位数的变量。
set x=1
set var=12345
:LOOP
set temp=%var:~0,%x%%
if %temp%==%var% goto END
set x=%x%+1
goto LOOP
:END
理论上,在代码的末尾,%x%将是%var%具有的位数。但是,它不起作用。我发现问题出在第3行。我修改了代码来诊断:
set x=1
set var=12345
:LOOP
set temp=%var:~0,%x%%
echo %temp%
pause
if %temp%==%var% goto END
set x=%x%+1
goto LOOP
:END
回应的结果是:
x%%
任何人都可以查明我的错误或提供替代解决方案来确定变量中的位数吗?
答案 0 :(得分:0)
由于字符串长度没有构建函数,您可以编写自己的函数。
@echo off
setlocal
set "myString=abcdef!%%^^()^!"
call :strlen result myString
echo %result%
goto :eof
:strlen <resultVar> <stringVar>
(
setlocal EnableDelayedExpansion
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
)
(
endlocal
set "%~1=%len%"
exit /b
)
这个函数总是需要13个循环,而不是需要strlen-loops的简单strlen函数 它处理所有字符。
答案 1 :(得分:0)
你正试图这样做:
@Echo Off
Set /P VrStr=Enter your string :
:Loop
If "%VrStr%" EQU "" Goto EndLoop
Set VrStr=%VrStr:~0,-1%
Set /A VrLgr+=1
Goto Loop
:EndLoop
Echo Number of char: %VrLgr%
Pause
您可以将其用于:
@echo off
setlocal EnableDelayedExpansion
Set /P $Tstring=Enter your string:
for /l %%a in (0,1,9000) do (set $t=!$Tstring:~%%a,1!&if not defined $t (echo [NB OF CHAR =] %%a&pause&exit /b))
pause
答案 2 :(得分:0)
您的代码的主要问题是
set temp=%var:~0,%x%%
这不起作用。解析器无法正确确定百分号符合哪个变量。您可以启用延迟扩展并将其写为
set "temp=!var:~0,%x%!"
对于替代版本,要处理任何长度的字符串,任何已发布的答案都将起作用。
对于更简单的解决方案,如果您确定字符串不超过10个字符,那么这是另一种选择
set "x=0123456789%var%"
set "x=%x:~-10,1%"
答案 3 :(得分:0)
这是一个简短的解决方案,仅适用于数字变量:
set /a Log=1%var:~1%-%var:~1% -0
set /a Len=%Log:0=+1%
变量%Len%
将包含%var%
中的位数。
基本想法是将第一个数字转换为1
,将其余数字转换为0
数字。然后我们可以使用字符串替换函数将所有0
替换为+1
给我们1+1+1....
并将字符串计算为算术表达式。这将为我们提供总位数。
&#39;尾随&#39;可以使用%var:~1%
获取数字,然后通过从变量本身中减去它们将它们转换为0
:45678 - 5678
给出4000
等。但是,上面的代码会从{减去1%var:~1%
{1}}而是为了用1
替换第一个数字(即1
后跟&#39;尾随&#39;数字)。
额外-0
的原因是%var%
只有一位数,例如7
。在这种情况下,表达式1%var:~1%-%var:~1%
将评估为1-
并且shell会抱怨:Missing operand.
-0
确保我们始终拥有有效的表达式。
现在我们已将变量转换为适当的格式%Log%
,我们可以使用0
将+1
的每次出现替换为%Log:0=+1%
并评估使用set /a
得到的表达式,给出了我们的最终结果。