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