Другие языки программирования и технологии

Как на языке программирования си сделать, чтобы при вводе полного бреда программа не поломалась?

Начали в институте изучать си. Дали такое задание на самостоятельный разбор: сделать так, чтобы когда вводишь в приложение (командная строка вин 32) полный бред, не то что задано параметрами программы, то чтобы программа не поломалась, а выбила что-то типа "не корректный ввод" и продолжила работу. Как это сделать именно на языке си? (а не на си++)
Пользователь всегда вводит только строку символов, а программа должна проверять их корректность и в случае успеха приводить средствами стандартной библиотеки к заданному типу данных, либо сообщать об ошибке.
Роман Можаев
Роман Можаев
60 309
Лучший ответ
В продолжение: после проверки типа
- числовые данные проверяются на интервал (нпрм, с датой проще всего 0<день месяца<32 и т. д. , неотрицательность или наоборот)
- для символьных данных м. б. свои ограничения (нпрм, число символов для номера телефона или определённый символ/комбинация в определённом месте)
А какая разница какой язык программирования. .

Ты описываешь ВСЕ возможные варианты ввода и действия по ним ...Если они не проходят - выдача сообщения и передача управления на метку ПЕРЕД проверкой

На абстрактном языке это будет как-то так (лет 15 не программировал.. . все 28 языков перепутались)

Метка1:

ВВЕСТИ Знач

Если Знач = 1 то Процедура1 Иначе

Если Знач = 2 то Процедура2 Иначе

Если Знач = 3 то Процедура3 Иначе

Вывести "Неверное значение"

Перейти на Метка1
Andrey Grigoriev
Andrey Grigoriev
85 877
Правила хорошего тона для командно-строковых программ говорят "умейте читать любой мусор из stdin, но сами мусор в stdout не пишите".

Так что могу предложить вариант ответа

if (!CheckArgv(...)) {
fprintf(stderr,...);
exit(не ноль) ;
}

, при этом аккуратная имплементация CheckArgv - за Вами.

Почему так все устроено:

Вашу программу из командной строки обычный пользователь будет крайне редко вызывать, командная строка нужна преимущественно для вызова программы других программ, а другие программы тоже не хотят решать проблему анализа Вашего мусора, который Вы собрались писать в stdout (например, Вы туда собрались писать мусорные сообщения об ошибках) . Поэтому пишите мусор в stderr (и лучше только самый необходимый) , а в stdout пишите только самое нужное в документированном и легко читаемом для других программ формате.

Ну а анализ мусорных данных Вам все же придется написать (см CheckArgv выше, это за Вами) .

PS. командная строка вин 32 - это чисто для обучения, командной строки в win32 на самом деле нет, потому что при написании Win32 программ все поголовно нарушают правило хорошего тона, про которое я написал выше.

Но это не значит, что для Вас такого правила хорошего тона тоже нет. Представьте себе, что Вы будете хоть в чем-то круче "изобретателей Windows", разве это плохо?
Harut Gurgenyan
Harut Gurgenyan
19 662