Как отфильтровать символы в программировании на C с исключениями - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь написать программу на C, которая запрашивает ввод у пользователя, и если ввод находится между заданными значениями float, появится вывод.в этом случае, если скорость на входе равна 20,5, то на выходе будет вторая передача.Я хочу отфильтровать все неверные данные.

У меня уже есть какой-то фильтр, но он плохо работает.если на входе «afgegq», это будет фильтр и снова попросит меня ввести.Но если это 156FFAGFAE.оно не будет отфильтровано.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    for (;;)
    {
        int versnelling[5] = {1, 2, 3, 4, 5};

        float speed = 0;
        printf("Please enter a speed: ");
        if (scanf("%f", &speed) != 1)
        {
            fputs("error: invalid input. Please enter a number\n",stderr);
            return 0;
        }

        if (0.0 < speed && speed < 10.0)
        {
            printf("The gear you are in is: %i\n", versnelling[0]);
        }
        else if (speed >= 10.0 && speed < 30.0)
        {
            printf("The gear you are in is: %i\n", versnelling[1]);
        }
        else if (speed >= 30.0 && speed < 60.0)
        {
            printf("The gear you are in is: %i\n", versnelling[2]);
        }
        else if (speed >= 60.0 && speed < 80.0)
        {
            printf("The gear you are in is: %i\n", versnelling[3]);
        }
        else if (speed >= 80.0 && speed <= 100)
        {
            printf("The gear you are in is: %i\n", versnelling[4]);
        }
        else if (speed > 100)
        {
            printf("I can not go faster then 100km/h \n");
        }
        else if (speed == 0)
        {
            printf("The gear you are in is: Neutral\n");
        }
        else if (speed < 0 && speed > -15)
        {
            printf("The gear you are in is: R\n");
        }
        else if (speed < -15)
        {
            printf("I can not go that fast in reverse\n");
        }
    }
}

Я хочу, чтобы оно отфильтровывало все, кроме цифр и буквы Q. Мне нужна буква Q, потому что я хочу создать среднее значение для ввода (я постараюсьузнай как позже).но знаю, мне это нужно.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Лучший способ обработки ошибочного пользовательского ввода - сначала прочитать строку , а затем проанализировать ее для float с strtof().

    printf("Please enter a speed: ");
    fflush(stdout); // Insure prompt is printed first

    char buf[100];
    if (fgets(buf, sizeof buf, stdin) == NULL) {
      printf("End of file\n");
      return 0;
    }

    if (toupper((unsigned char) *buf) == 'Q') == NULL) {
      printf("Q detected\n");
      break;
    }

    char *endptr; // location to store end of parsing
    errno = 0;
    *f = strtof(buf, &endptr); 
    bool no_conversion = buf == endptr;

    // Allow trailing white-space
    while (isspace((unsigned char) *endptr)) {
      endptr++;
    }

    if (no_conversion || *endptr) {
      fputs("error: invalid input. Please enter a number\n", stderr);
      continue; // No conversion or junk at the end
    }

    // Add additional tests if one wants to detect out-of-range (not shown)

    ....
0 голосов
/ 24 сентября 2019

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

Что вы можете сделать, так это получить строку из scanf и отфильтровать ее самостоятельно.Вы можете написать функцию, которая проверяет, состоит ли строка только из тех символов, которые вы хотите принять, и вызывать ее по вашему усмотрению.Примерно так:

char input[128];
if (scanf("%s", input) != 1 && check_input(input))

Конечно, вам придется самостоятельно конвертировать input в число с плавающей запятой (возможно, используя atof() или strtof()) и что-то делать с Q. Но вы будетеиметь больше контроля над тем, что вы принимаете.

...