Innym problemem jest to, że czytasz tylko scanf("%f", &input);
. Jeśli użytkownik wpisze coś, co nie może być zinterpretowane jako liczba zmiennoprzecinkowa C, np. "Pi", wywołanie scanf()
nie spowoduje przypisania niczego do input
i nie będzie się z tego dalej rozwijać. Oznacza to, że próbowałoby kontynuować czytanie "pi", a także nie.
Po zmianie na inne plakaty, które zalecają inne plakaty, wpisanie "pi" spowoduje niekończącą się pętlę drukowania poprzedniej wartości input
i drukowania monitu, ale program nigdy nie przetworzy żadnego nowego wkład.
scanf()
zwraca liczbę przydziałów wprowadzonych zmiennych wejściowych. Jeśli nie przydzieliło zadania, oznacza to, że nie znalazło liczby zmiennoprzecinkowej, i powinieneś przeczytać więcej danych wejściowych z czymś takim jak char string[100];scanf("%99s", string);
. Spowoduje to usunięcie następnego ciągu ze strumienia wejściowego (w każdym razie do 99 znaków - dodatkowy char
jest dla terminatora o wartości NULL w łańcuchu).
Wiesz, to przypomina mi o wszystkich powodach, dla których nienawidzę scanf()
, i dlaczego używam zamiast tego fgets()
, a następnie może analizować je za pomocą sscanf()
.
Uwaga: Przy założeniu, że dane wejściowe użytkownika nie jest wyprowadzony, sprawdzanie EOF prawdopodobnie nie jest idealna, ponieważ IIRC zwykle oznacza to, że użytkownik musi naciśnij ctrl + D, aby zamknąć, co jest nieoczywiste – Brian