Объясните как тут работает проверка на целое и то что введенное значение не символы? Заранее спасибо
int main() {
setlocale (LC_ALL, "RUS");
int a, b, c;
char s1, s2, s3;
float d;
printf("Введите значение переменной а=");
if (scanf("%d%c", &a, &s1) != 2 || s1 != '\n') {
printf("Некорректно введено значения а. Введите целое значение а!");
return -1;
}
Ответы (1 шт):
Что реализовано:
Считываем число ещё один символ за ним.
ысфта возвращает количество успешно считанных переменных. Мы просили две, значит если считались обе, то вернётся 2.
При считывании числа scanf остановится как только прочитает все цифры (после необязательного знака). Если числа вообще нет, он вернёт 0.
Если удалось считать оба значения, то в s1 лежит следующий за целым числом символ. Делается проверка, что он является переносом строки, т. е. после числа не было никакого мусора до конца строки.
Нюансы:
Код, который позволит подготовить возможность сделать вторую попытку ввода не реализован.
Пробельные символы после числа тоже будут расцениваться как неверный ввод.
Если при вводе числа пользователем происходит переполнение int'а, мы об этом никогда не узнаем.
Баги:
- Если используется перенаправление ввода и сразу за числом последует конец файла, всё пойдёт не по плану: ввод будет рассматриваться как неверный. И я не помню, что вернёт scanf - 1 или EOF. Подозреваю, что EOF.