Love0912 发表于 2024-10-20 13:07

批处理中判断输入是否是自然整数 无法正确输出的故障

先看代码
@echo off
setlocal enabledelayedexpansion

:input
set "cs="
set /p cs=请输入一个自然整数(按回车确认):

rem 检查是否为负数、零或非法字符
echo Debugging: cs=!cs!
if "!cs:~0,1!"=="-" || "!cs!"=="0" (
    goto :error
)

rem 使用 findstr 验证是否为自然整数
echo !cs! | findstr /r "*$" >nul
if errorlevel 1 (
    goto :error
)

echo 输入正确:!cs!
pause

:error
echo 输入错误:请输入一个自然整数(不包括负数、零或非法字符)!
goto :input

endlocal


这个代码本意是让用户输入正确的有效数字,即1以上的整数,不包含负数,0开头的数字或者小数以及非数字类的字符,否则提示用户重新输入,如果输入正确,则输出正确数值。
按代码逻辑来说,似乎编译的没有问题,但现在的情况是,可以正常输入,但无论你输入的是啥,敲回车后就直接关闭了,也不输出错误也不输出正确~~ 请各位大佬给瞅瞅哪里的问题
另外,问个额外的事,有啥编程软件适合需求量不高的人使用的,比如我,只是用编程软件写一下体积不大的实用小工具,不需要太复杂的命令,主要应用平台是WINDOS平台。。最好是中文的(主要是英语不好~),如果有的话也给推荐推荐~

Love0912 发表于 2024-10-21 08:50

gchq2005 发表于 2024-10-20 19:25
@echo off
setlocal enabledelayedexpansion



感谢大佬的支援,这是我修正后的代码,完美落地~
@echo off
setlocal enabledelayedexpansion

:input
set "cs="
set /p cs=请输入一个自然整数(按回车确认):
rem 使用 findstr 验证是否为自然整数
echo !cs!|findstr "[^0-9]">nul&&goto :error||goto :qqd
set "cs=0!cs!"rem 临时在前面加一个0
:qqd
rem 去除前导0
for /f "tokens=* delims=0" %%i in ("!cs!") do set "cs=%%i"
goto right

:error
echo 输入错误:请输入一个自然整数(不包括负数、零或非法字符)!
goto :input
:right
echo 输入正确:!cs!
goto :input
pause

资料爬虫 发表于 2024-10-20 13:22

是不是可以这么写,

@echo off
set /p input="请输入一个自然整数:"
set input=%input: =%
if not "%input%"=="" (
    if "%input%" LSS "1" (
      echo 输入不是一个自然整数。
    ) else (
      echo 输入是一个自然整数。
    )
) else (
    echo 输入无效,请输入一个数字。
)


要是主要WINDOS平台,简单的可以用批处理,稍微复杂点的可以用易语言(中文编程),python也可以,相比于批处理其他的需要编译后才能运行

archon1 发表于 2024-10-20 16:11

第8~13删除,第15行改为:
echo !cs! | findstr /r "^*$" >nul 2>nul
即可

Love0912 发表于 2024-10-20 18:00

资料爬虫 发表于 2024-10-20 13:22
是不是可以这么写,

@echo off


不行,你这个有BUG,比如002无法被识别,-22能被支持等,实际应用要能去除前缀0,正常识别整数,同时小数、负数、非数值要能报错才行~

Love0912 发表于 2024-10-20 18:04

archon1 发表于 2024-10-20 16:11
第8~13删除,第15行改为:
echo !cs! | findstr /r "^*$" >nul 2>nul[ ...

似乎不能正常运行,要不然你在自己试试?

gchq2005 发表于 2024-10-20 19:25

@echo off
setlocal enabledelayedexpansion

:input
set "cs="
set /p cs=请输入一个自然整数(按回车确认):

rem 使用 findstr 验证是否为自然整数
echo !cs!|findstr "[^0-9]">nul&&goto :error||goto :right
:error
echo 输入错误:请输入一个自然整数(不包括负数、零或非法字符)!
goto :input
:right
echo 输入正确:!cs!
goto :input
pause

需要去前导0,下一步自己处理就好

gchq2005 发表于 2024-10-21 10:37

Love0912 发表于 2024-10-21 08:50
感谢大佬的支援,这是我修正后的代码,完美落地~
@echo off
setlocal enabledel ...

09set "cs=0!cs!"rem 临时在前面加一个0
你这行不会被执行,没什么用呀!

老伙计 发表于 2024-10-21 11:12

本帖最后由 老伙计 于 2024-10-21 15:57 编辑

@Echo Off

:: 本代码要求从键盘输入一个正整数,并对输入内容进行检查,如果不符
:: 合要求则继续要求输入,直到满足要求为止。

Setlocal Enabledelayedexpansion

::-----------------------------------------------------------------------------------------------------------------------------------------------------

Goto Begin

::-----------------------------------------------------------------------------------------------------------------------------------------------------

:: check()
:: 函数功能:检查输入是否是一个整型数
:: 输入变量:VP - 待检查整数
:: 输出变量:VR - 检查结果,1 - 符合要求,0 - 不符合要求

:Check
Set VX=!VP!
Set /a VC=0
Set /a VR=0
:LP01
If Not {!VX!}=={} (
      Set /a VR=0
      Set VK=!VX:~0,1!
      If !VK! Geq 0 (
                If !VK! Lss 10 (
                        If !VC! Gtr 0 (Set /a VR=1)
                        If !VK! Gtr 0 (Set /a VR=1)
                )
      )
      If !VR!==1 (
                Set VX=!VX:~1!
                Set /a VC=!VC!+1
                Goto LP01
      )      
)
Goto :Eof

::-----------------------------------------------------------------------------------------------------------------------------------------------------

:Begin

Echo.
Set/p X="请输入一个正整数:"
Set VP=!X!
Call :Check
Echo.
If !VR!==1 (
      Echo. 您键入的是 !X!
) Else (
      Echo. 键入无效!
      Goto Begin
)
Echo.
Pause

Love0912 发表于 2024-10-21 13:13

gchq2005 发表于 2024-10-21 10:37
09set "cs=0!cs!"rem 临时在前面加一个0
你这行不会被执行,没什么用呀!

无所谓,留着混淆视听也挺好
页: [1]
查看完整版本: 批处理中判断输入是否是自然整数 无法正确输出的故障