[Язык C] Ввод симола в scanf (%d): ошибка бесконечного цикла


При выполнении заданий из седьмой главы, впервые столкнулся с «защемлением цикла«. Допустим пользователь вводит символ q в поле (не делайте так, если у вас нет возможности прервать программу):

#include <stdio.h>
int main (void)
{
int n;
scanf("%d", &n);
while (n > 0)
{
    printf("Enter 0 to quit:\n");
    scanf("%d", &n);
}
getchar();
return 0;
}

Программа застрянет в бесконечном цикле при вводе любого символьного значения. Отчего так?

Дело в том, что если тип переменной в scanf не совпадает, программа его не считывает; но при этом и не удаляет из буфера. В итоге, цикл к ней бесконечно возвращается.

Почему символ не удаляется? Это нужно для того, чтобы если вы считываете последовательность, например, scanf с вводом %d%f и на вводе у вас 123Vasiascanf  не затер символ V, когда до него дойдет.

Чтобы подобных ошибок не происходило, необходимо чистить буфер, например, так:

#include <stdio.h>
int main (void)
{
int n;
scanf("%d", &n);
while (n > 0)
{
    while (getchar() != '\n')
        continue;
    printf("Enter 0 to quit:\n");
    scanf("%d", &n);
}
getchar();
return 0;
}

Буду рад вашим комментам!


Запись опубликована в рубрике С (Си). Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.