【问题标题】:Long Long, decimals and input validation in CC 中的 Long Long、小数和输入验证
【发布时间】:2011-11-19 15:40:16
【问题描述】:

目前我正在使用 TCC,因为它是在 Windows 上进行设置最简单的方法。只需解压缩,您就可以开始使用了。但是我对其他编译器、GCC、微软提供的任何东西等都持开放态度。

我的问题是我需要验证一个大小为 16 的整数数组的输入。这是我的规则:

if number is under 15 (including negative values) then input is valid
if number is under -2147483648 then -2147483648

if number is over 2147483647 then 15
else if number is over 15 then mod 16

if the number is a decimal, remove decimal point and validate again

考虑到我正在使用 C,最后一点让我很害怕,我稍后会回来。目前我只是尝试处理前 4 个条件。

我遇到的问题是尝试测试外部边界会导致整数溢出并搞砸我的检查。因此,我制作了一个临时的 long long 数组来保存输入以进行验证。成功验证所有内容后,它应该适合整数数组,因此我将(以某种方式)将 long long 从临时数组复制到实际数组并正常启动程序。

我已经搞砸了很长一段时间,并试图做我想做的事,但我的代码很快变得混乱,一切都如此模糊,并且在 C 中依赖于机器,所以当出现问题时,我不知道是不是我和我糟糕的编码,或者我的机器与其他人不同的事实导致了错误。我会坚持下去,因为我知道这种事情可以调查和解决,但是我不想在这上面浪费太多时间,所以我会问一下,看看是否有捷径。

十进制验证部分我对如何处理有各种想法,但我不抱希望。你有什么意见?

任何想知道我为什么这样做的人:没关系,我可以很容易地解决需要这个数组的更高级别的问题,并且它适用于所有有效的输入。但是我现在只是迂腐,因此提出了这个问题。

【问题讨论】:

  • 您可能应该将您的问题视为与字符串相关,而不是与数字相关...
  • 在您的最后一条规则中,您的意思是删除小数点还是四舍五入?
  • @Basile:正是我说我很害怕的原因:PC 和字符串不能很好地混合。
  • 不,C 是一种低级语言,可以很好地处理字符串。
  • 高效,但不优雅。 @leemes:是的,我的意思是删除小数点,然后根据新值重新验证

标签: c arrays validation tcc long-long


【解决方案1】:

首先,您的条件存在一些问题。如果一个数字低于 -2147483648,那么它也低于 15,因此检查永远不会匹配(对于 15 岁以下的数字,它们都不是小数)。

其次,您可以使用 strtol 检查溢出(检查 errno 以获得 ERANGE),然后与您的限制进行比较(尽管如果您的 long 有 32 位并且是二进制补码,则不需要)。

对于小数,如果您总是想删除小数点(不是您说的想要的,因为您在一系列其他条件失败的情况下设置了小数点),您可以设置一个预处理步骤,从字符串中删除句点.它可以很容易地用两个指针就地完成——一个读指针和一个写指针。

【讨论】:

  • 从字符串中删除句点的预处理步骤?但我需要在运行时进行。你能详细说明你的意思吗?是的,对不起,如果链:P
  • @TheIronKnuckle 我的意思是在进行检查之前。
  • @TheIronKnuckle Somethink like for (wp = s; *s; s++) { if (*s != '.') *wp++ = *s; }; *wp = '\0'; 其中wp 是写指针,s 是读指针。
  • 应该是strtol而不是strol
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 2010-11-30
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多