scanf
вернет количество назначенных предметов. В вашем случае, поскольку строка формата содержит только %lf
, она вернет 1
именно в том случае, если вы получили double
. Проблема с вашим кодом в том, что вы сначала вызываете scanf
внутри цикла, который будет читать double
из потока. Затем в вашем while
состоянии вы снова вызываете scanf
, но нет другого double
для чтения, поэтому scanf
ничего не делает.
То, как я написал бы ваш код, было бы примерно таким:
int no_assigned;
do {
printf("Input?");
no_assigned = scanf("%lf", &input);
} while (no_assigned != 1);
Дополнительная переменная существует потому, что мне кажется, что scanf
- это код, который должен быть внутри цикла, а не в условии while
, но это действительно личное предпочтение; вы можете исключить дополнительную переменную и переместить (отметить, переместить, а не копировать) вызов scanf
внутри условия вместо этого.
РЕДАКТИРОВАТЬ: И вот версия с использованием fgets
, что, вероятно, лучше:
double input;
char buffer[80];
do {
printf("Input? ");
fflush(stdout); // Make sure prompt is shown
if (fgets(buffer, sizeof buffer, stdin) == NULL)
break; // Got EOF; TODO: need to recognize this after loop
// TODO: If input did not fit into buffer, discard until newline
} while (sscanf(buffer, "%lf", &input) != 1);