Long Long, десятичные дроби и проверка ввода в C - PullRequest
0 голосов
/ 19 ноября 2011

В настоящее время я использую TCC, так как проще всего настроить Windows. Просто распакуйте и вы готовы к работе. Тем не менее, я открыт для других компиляторов, GCC, для любых предложений Microsoft и т. Д.

Моя проблема в том, что мне нужно проверить входные данные в массиве целых чисел размера 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 из массива temp в реальный и запустите программу как обычно.

Я бездельничал и пытался делать то, что хотел, но мой код быстро запутывался, и все в C так расплывчато и зависело от машины, поэтому, когда что-то идет не так, я не знаю, так ли это я и мой дерьмовый код, или тот факт, что моя машина отличается от всех остальных, что вызывает ошибку. Я буду придерживаться этого, потому что я знаю, что такого рода вещи можно исследовать и решать, однако я не хочу тратить на это слишком много времени, поэтому я спрошу об этом и посмотрю, есть ли ярлык.

Десятичная часть проверки. У меня есть разные идеи о том, как подойти, но я не надеюсь. Каково ваше мнение?

Любой, кто хочет знать, почему я это делаю: не имеет значения, я могу решить проблему более высокого уровня, которая требует этот массив довольно легко, и он будет работать для всех допустимых входных данных. Однако сейчас я просто педантичен, отсюда и этот вопрос.

1 Ответ

1 голос
/ 19 ноября 2011

Во-первых, в ваших условиях есть некоторые проблемы. Если число меньше -2147483648, оно также меньше 15, так что проверка никогда не совпадает (и не является десятичным числом для чисел меньше 15).

Во-вторых, вы можете проверить переполнение с помощью strtol (проверьте errno для ERANGE), а затем сравнить с вашими лимитами (хотя нет необходимости, если ваш long имеет 32-битный код и является дополнением до двух).

Что касается десятичных дробей, если вы всегда хотите удалить десятичную точку (а не то, что вы говорите, потому что вы обусловливаете выполнение ряда других условий невыполнением), вы можете настроить шаг предварительной обработки, удаляющий точки из строки , Это можно легко сделать на месте с помощью двух указателей - указателя чтения и указателя записи.

...