При выполнении заданий из седьмой главы, впервые столкнулся с «защемлением цикла«. Допустим пользователь вводит символ 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 и на вводе у вас 123Vasia — scanf не затер символ 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;
}
Буду рад вашим комментам!
