Повторное открытие stdin
может работать после первого цикла
freopen(NULL, "rb", stdin);
Или рассмотреть @ Джонатан Леффлер идея clearerr(stdin)
.
Как насчет того, чтобы вместо Ctrl d завершить ввод (который закрывает stdin
), использовать Enter ?
Создать функцию для чтения строка из float
.
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
int read_rest_of_line(FILE *stream) {
int ch;
do {
ch = fgetc(stream);
} while (ch != '\n' && ch != EOF);
return ch;
}
// Read a line of input of float`s. Return count
int read_line_of_floats(float *x, int n) {
bool char_found = false;
int count;
for (count = 0; count < n; count++) {
// Consume leading white-space looking for \n - do not let "%f" do it
int ch;
while (isspace((ch = getchar()))) {
char_found = true;
if (ch == '\n') {
return count;
}
}
if (ch == EOF) {
return (count || char_found) ? count : EOF;
}
ungetc(ch, stdin);
if (scanf("%f", &x[count]) != 1) {
read_rest_of_line(stdin);
return count;
}
}
read_rest_of_line(stdin);
return count;
}
Выше все еще требуется некоторая работа, связанная со случаями ребер: n==0
, когда возникает редкая ошибка ввода, size_t
, обработка не-числовой ввод и т. д.
Затем используйте его всякий раз, когда требуется ввод float
.
#define FN 33
int main(void) {
float poly[FN];
int count = read_line_of_floats(poly, FN);
// Please specify positions for evaluation
printf("Bitte Stellen zur Auswertung angeben\n");
float x;
float res;
while (read_line_of_floats(&x, 1) == 1) {
res = 0;
for (int i = 1; i < count; i++) {
res += poly[i - 1] * x + poly[i];
}
// Value of the polynomial at the location
printf("Wert des Polynoms an der Stelle %f: %f\n", x, res);
}
}