[Язык 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;
}

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

This entry was posted in С (Си). Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *