吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 536|回复: 9
收起左侧

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

[复制链接]
Love0912 发表于 2024-10-20 13:07
先看代码
[Asm] 纯文本查看 复制代码
@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 "[1-9][0-9]*$" >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

感谢大佬的支援,这是我修正后的代码,完美落地~
[Asm] 纯文本查看 复制代码
@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行改为:
[Bash shell] 纯文本查看 复制代码
echo !cs! | findstr /r "^[1-9][0-9]*$" >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行改为:
[mw_shl_code=bash,false]echo !cs! | findstr /r "^[1-9][0-9]*$" >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,下一步自己处理就好

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Love0912 + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!

查看全部评分

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

09  set "cs=0!cs!"  rem 临时在前面加一个0
你这行不会被执行,没什么用呀!
老伙计 发表于 2024-10-21 11:12
本帖最后由 老伙计 于 2024-10-21 15:57 编辑

[Shell] 纯文本查看 复制代码
@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
09  set "cs=0!cs!"  rem 临时在前面加一个0
你这行不会被执行,没什么用呀!

无所谓,留着混淆视听也挺好
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 00:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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