You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键改动说明

  1. 删掉了value()函数:直接用datatype(NumInt, 'W')检查输入字符串本身,不会触发变量解析错误
  2. 添加strip(NumInt):去除输入前后的空格,用户不小心输入空格也能正常通过验证
  3. 修正了输出变量名:原代码最后用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:22:52