0

目前我正在使用 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 中依赖于机器,所以当出现问题时,我不知道是我还是我的糟糕的编码,或者我的机器与其他人不同的事实导致了错误。我会坚持下去,因为我知道可以调查和解决这种事情,但是我不想在这上面浪费太多时间,所以我会问一下,看看是否有捷径。

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

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

4

1 回答 1

1

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

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

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

于 2011-11-19T15:48:34.430 回答