В C, Как я могу ограничить принятые значения, которые примет этот scanf? - PullRequest
1 голос
/ 27 февраля 2012

Я бы хотел ограничить возможные значения, которые может иметь следующая переменная patient_id (по соображениям безопасности).Вот код, который у меня сейчас есть, но я уверен, что это неправильный подход:

   void addPatient(){
           int patient_id;
           printf("Enter ID between 10000 & 99999: ");           
           do{
           scanf("%d", &patient_id);
           }while((patient_id<10000)&&(patient_id>99999));

    }

Ответы [ 5 ]

4 голосов
/ 27 февраля 2012

Если вы не пишете программу для домашнего задания, и, в частности, если вы пишете программу, с которой реальный пользователь будет взаимодействовать любым серьезным образом, не используйте scanf () ,Работайте на строках ввода одновременно.Если вы по-прежнему хотите использовать функцию синтаксического анализа функции scanf (), вы можете использовать sscanf () и т. Д. Для всей строки ввода после ее получения.Если вы не знаете, как получить пользовательский ввод, кроме как через scanf (), простой способ - это fgets () в буфер, выделить строку и подготовить буфер для следующих fgets ().

Если вы настаиваете на использовании scanf (), у меня для вас есть проблема: использовать его, чтобы принять два идентификатора в одной строке, разделенные пробелом.Если пользователь вводит только один идентификатор, а затем нажимает клавишу ввода, ваша программа должна пожаловаться на это пользователю, прежде чем запрашивать дополнительные данные.

2 голосов
/ 27 февраля 2012

(1) Используемый вами чек верен;. * scanf не знает ограничений целочисленного диапазона.

(2) Как отмечали другие авторы, scanf () не создает хороших пользовательских интерфейсов.Используйте readline () для получения строк и sscanf для их анализа, и вы будете счастливее.

(3) Вы ограничиваете эти значения в целях безопасности?Если это действительно проблема безопасности, то не должны быть магическими числами, а #defines или статическими константами или глобальными переменными, так что если кто-то изменит эти диапазоны без обновления вашего кода, ваша проверка безопасностине скомпрометирован.

2 голосов
/ 27 февраля 2012

Этот код должен ограничивать значение, которое должен иметь Patient_id. На данный момент это не самый эффективный способ, но если вы хотите использовать scanf (), то это может помочь.

#include <stdio.h>
int patient_id(void);

int main(void)
{
 int id=0;
 id = patient_id();

 printf("\nThe patient_id is: %d\n", id);
}

int patient_id(void)
{
    int p_id;
    int ch;

    printf("Enter ID between 10000 & 99999: ");
    scanf("%d", &p_id);

    while ((p_id <10000 || p_id >99999))
        {
            while((ch = getchar()) !='\n')
               continue;

            printf("Please enter a value between 10000 and 99999:  ");
            scanf("%d", &p_id);
        }
    return p_id;
}
2 голосов
/ 27 февраля 2012

ваше состояние должно быть

while((patient_id < 10000) || (patient_id > 99999))

для этой цели

1 голос
/ 27 февраля 2012

Вы не можете контролировать входные значения, принимая эти значения.Вы должны сначала принять значения, а затем вы можете проверить условие, является ли введенный ввод правильным или нет.Вы можете сгенерировать предупреждение о неправильных вводах.

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

например.1, 200124, 45, 9999, 321, 12001 .Здесь ваш prgm перестанет принимать ввод, когда пользователь вводит 12001.

...