Вы можете использовать:
while (printf("Enter a positive integer: ") > 0 &&
scanf("%d", &n) == 1 &&
n < 0)
{
printf("Error: please enter a positive integer\n");
}
Останавливается, если происходит сбой printf()
, если происходит сбой scanf()
или если значение в n
неотрицательно. Хорошая идея всегда проверять, что scanf()
успешен. Просто удобно, что printf()
возвращает количество написанных им символов (или отрицательное число при неудаче), чтобы его можно было использовать и в условии. Вы также можете добавить fflush(stdout) == 0 &&
в стек операций.
Или вы можете решить, что код в условии должен быть в функции:
static int read_positive_integer(void)
{
int value;
if (printf("Enter a positive integer: ") > 0 &&
fflush(stdout) == 0 &&
scanf("%d", &value) == 1 &&
value >= 0)
return value;
return -1;
}
, а затем вызывающий код:
while ((n = read_positive_integer()) < 0)
printf("Error: please enter a positive integer\n");
Есть много вариаций на тему; вы можете заключить цикл while
в функцию; Вы можете сделать подсказки в параметрах функции. Возможно, вы решите быть более осторожным, сообщая о том, что идет не так (другие действия, если printf()
завершается неудачей, по сравнению с тем, что происходит, если scanf()
возвращает 0 (нечисловые данные на входе) или EOF (больше нет данных на входе).