Мой код работает нормально, но я работаю с довольно большой программой и хотел бы найти более простой/короткий способ сделать то же самое. Мне нужно проверить, что пользователь вводит данные, которые действительны в соответствии с тем, что спрашивают.

Как я это делаю сейчас:

while(validDoses == 0) {
    printf("Enter Recommended Shot Doses (1-255): ");
    scanf(" %d", &shotDoses);
    if(shotDoses >= 1 && shotDoses <= 255) {
        validDoses = 1;
    }
    else {
        printf("\n\033[1;31mPlease Enter a Valid Number.\033[0m\n");
    }
}

Есть ли более короткий способ сделать это? Спасибо.

c
0
glwhitaker2 4 Фев 2022 в 01:47
1
Не вижу в этом проблемы
 – 
OldProgrammer
4 Фев 2022 в 01:49
Ваша проблема в том, что вы должны делать это для многих разных подсказок? Например, дозы, возраст, вес...? Это все цифры?
 – 
pm100
4 Фев 2022 в 01:57
1
Единственное, что вы можете сделать, это проверить возврат scanf.
 – 
Chris
4 Фев 2022 в 02:00
2
space в " %d" лишний. Спецификатор преобразования "%d" уже отбрасывает начальные пробелы. На самом деле все спецификаторы преобразования, ЗА ИСКЛЮЧЕНИЕМ "%c", "[...]" и "%n", отбрасывают начальные пробелы.
 – 
David C. Rankin
4 Фев 2022 в 02:01
Что делать, если пользователь вводит буквенные символы? Вы не проверяете возвращаемое значение scanf, поэтому вы не знаете, успешно ли он отсканировал число или нет. Выходная переменная будет неинициализирована или будет иметь значение из предыдущего цикла, поэтому она может случайно оказаться допустимым значением. Кроме того, буквенные символы не будут удалены из ввода, потому что они не были успешно отсканированы, поэтому у вас будет бесконечный цикл. Вам нужно проверить возвращаемое значение.
 – 
Jerry Jeremiah
4 Фев 2022 в 03:02

2 ответа

Если вы определите

#define p printf
#define s scanf
#define E "Enter Recommended Shot Doses (1-255): "
#define D shotDoses
#define v validDoses
#define N "\n\033[1;31mPlease Enter a Valid Number.\033[0m\n"
#define w while
#define e else
#define i if
#define z " %d"

Тогда он может быть очень коротким.

w(v==0){ p(E); s(z, &D); i(D >= 1 && D <= 255) v = 1; e p(z);}
0
0___________ 4 Фев 2022 в 02:06

Давайте напишем неопределенный цикл и разорвемся только тогда, когда будет предоставлен допустимый ввод.

for (;;) {
    printf("Enter Recommended Shot Doses (1-255): ");
    scanf("%d", &shotDoses);

    if (shotDoses >= 1 && shotDoses <= 255) break;
    
    printf("\n\033[1;31mPlease Enter a Valid Number.\033[0m\n");
}
0
Chris 4 Фев 2022 в 02:12