C中的长整数,小数和输入验证

时间:2011-11-19 15:40:16

标签: c arrays validation tcc long-long

目前我正在使用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个条件。

我遇到的问题是尝试测试外部边界会导致Integer溢出并搞砸我的检查。所以我已经做了一个临时数组的long long来保存输入以进行验证。一切都成功验证的那一刻它应该适合整数数组,所以我会(以某种方式)将长数据从temp数组复制到实际数组并正常启动程序。

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

十进制验证部分我有很多关于如何处理的想法,但我没有希望。你有什么看法?

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

1 个答案:

答案 0 :(得分:1)

首先,您的情况有一些问题。如果数字低于-2147483648,则它也低于15,因此检查永远不会匹配(对于15岁以下的数字,它们都不是小数)。

其次,您可以使用strtol检查溢出(检查errno ERANGE),然后与您的限制进行比较(尽管您的长度为32位并且不需要两个补码)。

对于小数,如果你总是想要删除小数点(不是你想要的那个,因为你在一系列其他条件失败的条件下),你可以设置一个预处理步骤,从字符串中删除句点。它可以使用两个指针轻松完成 - 读指针和写指针。