Другие языки программирования и технологии
Как на языке программирования си сделать, чтобы при вводе полного бреда программа не поломалась?
Начали в институте изучать си. Дали такое задание на самостоятельный разбор: сделать так, чтобы когда вводишь в приложение (командная строка вин 32) полный бред, не то что задано параметрами программы, то чтобы программа не поломалась, а выбила что-то типа "не корректный ввод" и продолжила работу. Как это сделать именно на языке си? (а не на си++)
Пользователь всегда вводит только строку символов, а программа должна проверять их корректность и в случае успеха приводить средствами стандартной библиотеки к заданному типу данных, либо сообщать об ошибке.
В продолжение: после проверки типа
- числовые данные проверяются на интервал (нпрм, с датой проще всего 0<день месяца<32 и т. д. , неотрицательность или наоборот)
- для символьных данных м. б. свои ограничения (нпрм, число символов для номера телефона или определённый символ/комбинация в определённом месте)
- числовые данные проверяются на интервал (нпрм, с датой проще всего 0<день месяца<32 и т. д. , неотрицательность или наоборот)
- для символьных данных м. б. свои ограничения (нпрм, число символов для номера телефона или определённый символ/комбинация в определённом месте)
А какая разница какой язык программирования. .
Ты описываешь ВСЕ возможные варианты ввода и действия по ним ...Если они не проходят - выдача сообщения и передача управления на метку ПЕРЕД проверкой
На абстрактном языке это будет как-то так (лет 15 не программировал.. . все 28 языков перепутались)
Метка1:
ВВЕСТИ Знач
Если Знач = 1 то Процедура1 Иначе
Если Знач = 2 то Процедура2 Иначе
Если Знач = 3 то Процедура3 Иначе
Вывести "Неверное значение"
Перейти на Метка1
Ты описываешь ВСЕ возможные варианты ввода и действия по ним ...Если они не проходят - выдача сообщения и передача управления на метку ПЕРЕД проверкой
На абстрактном языке это будет как-то так (лет 15 не программировал.. . все 28 языков перепутались)
Метка1:
ВВЕСТИ Знач
Если Знач = 1 то Процедура1 Иначе
Если Знач = 2 то Процедура2 Иначе
Если Знач = 3 то Процедура3 Иначе
Вывести "Неверное значение"
Перейти на Метка1
Правила хорошего тона для командно-строковых программ говорят "умейте читать любой мусор из stdin, но сами мусор в stdout не пишите".
Так что могу предложить вариант ответа
if (!CheckArgv(...)) {
fprintf(stderr,...);
exit(не ноль) ;
}
, при этом аккуратная имплементация CheckArgv - за Вами.
Почему так все устроено:
Вашу программу из командной строки обычный пользователь будет крайне редко вызывать, командная строка нужна преимущественно для вызова программы других программ, а другие программы тоже не хотят решать проблему анализа Вашего мусора, который Вы собрались писать в stdout (например, Вы туда собрались писать мусорные сообщения об ошибках) . Поэтому пишите мусор в stderr (и лучше только самый необходимый) , а в stdout пишите только самое нужное в документированном и легко читаемом для других программ формате.
Ну а анализ мусорных данных Вам все же придется написать (см CheckArgv выше, это за Вами) .
PS. командная строка вин 32 - это чисто для обучения, командной строки в win32 на самом деле нет, потому что при написании Win32 программ все поголовно нарушают правило хорошего тона, про которое я написал выше.
Но это не значит, что для Вас такого правила хорошего тона тоже нет. Представьте себе, что Вы будете хоть в чем-то круче "изобретателей Windows", разве это плохо?
Так что могу предложить вариант ответа
if (!CheckArgv(...)) {
fprintf(stderr,...);
exit(не ноль) ;
}
, при этом аккуратная имплементация CheckArgv - за Вами.
Почему так все устроено:
Вашу программу из командной строки обычный пользователь будет крайне редко вызывать, командная строка нужна преимущественно для вызова программы других программ, а другие программы тоже не хотят решать проблему анализа Вашего мусора, который Вы собрались писать в stdout (например, Вы туда собрались писать мусорные сообщения об ошибках) . Поэтому пишите мусор в stderr (и лучше только самый необходимый) , а в stdout пишите только самое нужное в документированном и легко читаемом для других программ формате.
Ну а анализ мусорных данных Вам все же придется написать (см CheckArgv выше, это за Вами) .
PS. командная строка вин 32 - это чисто для обучения, командной строки в win32 на самом деле нет, потому что при написании Win32 программ все поголовно нарушают правило хорошего тона, про которое я написал выше.
Но это не значит, что для Вас такого правила хорошего тона тоже нет. Представьте себе, что Вы будете хоть в чем-то круче "изобретателей Windows", разве это плохо?
Похожие вопросы
- Язык программирования Си
- Как в языке программирования СИ осуществлять вызов подпрограммы, которая находится в другом файле?
- Ребята, скажите где можно скачать язык программирования Си, без ++
- Помогите пожалуйста решить задачу по программированию (язык программирования СИ)
- Помогите пожалуйста найти ошибку в задаче (Язык программирования Си)
- Как на языке программирования Си убрать конкретный напечатанный элемент массива или напечатать его в определенном месте?
- Кто знает язык программирования Си++? Можно ли вывести текст по другому?
- Массивы данных на языке программирования СИ.
- Оконное приложение на WinAPI, вопрос про параметры функции WndProc. Язык программирования Си.
- Возможно задаю глупый вопрос, так что извиняйте, почему бы в языках программирования не сделать динамические переменные?