Объясните как тут работает проверка на целое и то что введенное значение не символы? Заранее спасибо

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 шт):

Автор решения: Qwertiy

Что реализовано:

  • Считываем число ещё один символ за ним.

  • ысфта возвращает количество успешно считанных переменных. Мы просили две, значит если считались обе, то вернётся 2.

  • При считывании числа scanf остановится как только прочитает все цифры (после необязательного знака). Если числа вообще нет, он вернёт 0.

  • Если удалось считать оба значения, то в s1 лежит следующий за целым числом символ. Делается проверка, что он является переносом строки, т. е. после числа не было никакого мусора до конца строки.

Нюансы:

  • Код, который позволит подготовить возможность сделать вторую попытку ввода не реализован.

  • Пробельные символы после числа тоже будут расцениваться как неверный ввод.

  • Если при вводе числа пользователем происходит переполнение int'а, мы об этом никогда не узнаем.

Баги:

  • Если используется перенаправление ввода и сразу за числом последует конец файла, всё пойдёт не по плану: ввод будет рассматриваться как неверный. И я не помню, что вернёт scanf - 1 или EOF. Подозреваю, что EOF.
→ Ссылка