REXX整数输入验证问题:如何避免非法字符致程序崩溃
问题原因
你的程序崩溃是因为用了value(NumInt)——这个函数会把用户输入的字符串当成变量名去解析取值,一旦输入里有逗号、百分号这类不能作为变量名的字符,就会触发语法错误直接终止程序。
修复方法
直接对用户输入的原始字符串做整数验证,不需要通过value()中转。REXX自带的datatype函数可以直接检查字符串是否为整数,再加上处理空格的小优化,就能彻底解决问题。
修复后的完整代码
do forever call charout, "Enter number: " pull NumInt say /* 先去掉输入前后的空格,避免用户误输入空格导致验证失败 */ NumInt = strip(NumInt) if (NumInt\== '') then do /* 直接检查输入是否为整数,无需value()函数 */ if datatype(NumInt, 'W') then leave else do say "Error: Enter only whole number." say end end else do say "Error: <Enter> key accidentally triggered." say end end /* 修正了变量名错误,原代码里的NumeroInteiro是未定义的 */ say "Valid input provided: " || NumInt say call charout, "Press <Enter> to finish... " pull exit
关键改动说明
- 删掉了
value()函数:直接用datatype(NumInt, 'W')检查输入字符串本身,不会触发变量解析错误 - 添加
strip(NumInt):去除输入前后的空格,用户不小心输入空格也能正常通过验证 - 修正了输出变量名:原代码最后用了
NumeroInteiro,但实际接收输入的变量是NumInt,这会导致未定义变量错误
可选:更严格的整数验证
如果需要禁止正负号(只接受非负整数),或者确保每个字符都是数字,可以用自定义函数:
/* 自定义函数:检查是否为纯数字组成的非负整数 */ isStrictNonNegativeInt: procedure parse arg inputStr inputStr = strip(inputStr) if inputStr == '' then return 0 do i = 1 to length(inputStr) /* 逐个字符检查是否为数字 */ if datatype(substr(inputStr,i,1), 'N') == 0 then return 0 end return 1
使用时把datatype(NumInt, 'W')替换成isStrictNonNegativeInt(NumInt)就行。
内容的提问来源于stack exchange,提问作者SwFly
相关产品推荐
相关产品推荐

