2016-01-20 2 views
0

У меня есть следующий код, чтобы спросить пользователя для ввода (lowWarp). Вход должен быть от 1,0 до 10,0. Если я вхожу, скажем, 0,2, это позволяет мне попытаться ввести другое значение. Однако, если я ввешу что-то вроде 1/2 или asdf, он начнет бесконечно зацикливаться. Как предотвратить это и вместо этого ввести правильное значение?Как проверить правильность ввода данных в C

while (badData == true) 
{ 
    printf("Enter the low warp factor; warp factor = \n"); 
    scanf_s("%f", &lowWarp); 
    if (lowWarp < 1.0 || lowWarp > 10.0) //Determines if number is between 1.0 - 10.0 
    { 
     badData = true; 
     printf("Invalid input! Range is 1.0 - 10.0.\n"); 
     lowWarp = 0.0; 
    } 
    else 
    { 
     badData = false; 
    } 
} 
+2

Прочитайте ввод с помощью 'fgets()', а затем проанализируйте его. – chux

+0

Возможный дубликат [Проверка ввода с помощью scanf()] (http://stackoverflow.com/questions/15228388/input-validation-using-scanf) – perror

+2

Для интерактивных сеансов всегда * читайте целую строку *. –

ответ

0

Вы можете использовать функцию isdigit(). Если да, взгляните на возвращаемое значение и используйте его для проверки.

1

scanf() не будет отбрасывать недопустимый ввод. Поэтому он читается снова и снова и приводит к бесконечному циклу. Вы можете прочитать линию с помощью fgets() и разобрать его с помощью sscanf():

char line[1024]; 
    float lowWarp; 

    fgets(line, sizeof line, stdin); 

    if(sscanf(line, "%f", &lowWarp) != 1) { 
    /* invalid */ 
    } 
+0

Спасибо за ваш вклад! Я попытаюсь понять и использовать это. –

0

scanf_s("%f", &lowWarp); не потребляет плохой вход, как он повторно ищет действительный числовой ввод. Результат: бесконечный цикл, когда "asdf" введен и scanf_s() снова вызван.

Как хороший код, который обрабатывает злые вещи, которые пользователь может ввести, требует нескольких тестов, может также сделать вспомогательную функцию.

// 0:success or EOF 
int Read_float(const char *prompt, float *dest, float min, float max) { 
    for (;;) { 
    char buf[100]; 
    fputs(prompt, stdout); 
    fflush(stdout); 
    if (fgets(buf, sizeof buf, stdin) == NULL) { 
     return EOF; 
    } 
    char *endptr; 
    double y = strtod(buf, &endptr); 
    if (buf == endptr || *endptr != '\n') { 
     continue; // only \n entered or invalid `chars` entered 
    } 
    if (y >= min && y <= max) { 
    *dest = (float) y; 
    return 0; // success 
    } 
    } 
} 

float lowWarp; 
if (Read_float("Enter the low warp factor; warp factor = \n", 
    &lowWarp, 1.0f, 10.0f) == EOF) { 
    Handle_EOF(); 
} 

float highWarp; 
if (Read_float("Enter the high warp factor; warp factor = \n", 
    &highWarp, 10.0f, 100.0f) == EOF) { 
    Handle_EOF(); 
} 
+0

Поскольку я новичок в C, я изо всех сил стараюсь понять решение I3x, не говоря уже о сложности вашего кода. Я очень благодарю вас за ваш вклад и проведу день на Google, рассматривая ваше решение. –