Чтение только плавающих чисел и отклонение целых чисел и символов (ab, c et c.) До тех пор, пока не будет правильным - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь написать код в C (g cc), чтобы принимать только плавающие числа и отклонять целые числа, специальные символы, буквенно-цифровые c записи.

Я хочу, чтобы он видел, printf("First number: \n"); и printf("Second number: \n"); - числа с плавающей запятой с десятичными знаками, в противном случае попросите пользователя повторно ввести плавающее число, поскольку его первый ввод был недопустимым.

Я хочу, чтобы это произошло до того, как начнется вычисление. Если возможно, мне нужен пример кода

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


int  main(void)
{
   setvbuf(stdout, NULL, _IONBF, 0);
   setvbuf(stderr, NULL, _IONBF, 0);

   float a, b, sm;
   int i = 2;



   printf("First number: \n");
   scanf("%f", &a);


   printf("Second number: \n");
   scanf("%f", &b);


   printf ("%.2f + %.2f = %.2f -> Summe \n", a, b, sm = a+b); 
   printf ("%.2f / %d = %.2f -> Mittelwert \n", sm, i, sm/i); 
   printf ("%.2f - %.2f = %.2f -> Differenz \n", a, b, a-b); 
   printf ("%.2f * %.2f = %.2f -> Produkt \n", a, b, a*b);  
   printf ("%.2f / %.2f = %.2f -> Division\n", a, b, a/b); 





}

Спасибо за ваше время!

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

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

Тогда вам нужно будет явно игнорировать неправильный ввод (например, сканировать «не новую строку», игнорируя его), чтобы иметь возможность впоследствии принять исправленный ввод от пользователя. Это непросто, см. Статью по ссылке в конце.
Делайте это в al oop, пока не будете удовлетворены.

В качестве альтернативы (метод, широко рекомендуемый здесь, в StackOverflow), считывайте целые строки через fgets() в буфер, затем определитесь с правильностью путем синтаксического анализа.
Пропустить неправильный синтаксис, просто прочитав следующую строку в буфер.
Если все правильно, сканировать из буфера.

Полезная статья по топам c: руководство для начинающих от scanf () .

1 голос
/ 19 июня 2020

Целые числа будут преобразованы в числа с плавающей запятой, т. Е. Если задано число 5, оно будет неявно преобразовано в 5.0 для переменной с плавающей запятой. Следовательно, не стоит беспокоиться об этом.

Используйте следующую программу:

#include <stdio.h>

float ask_loop(float f) {
    int ret = scanf("%f", &f);
    float fl = f;

    if (ret != 1) { // if scanf() returns error code
        printf("Error! Please input numbers correctly.\n");
        fflush(stdin);
        fl = ask_loop(f);
    }

    return fl;
}

int main(void)
{
    setvbuf(stdout, NULL, _IONBF, 0);
    setvbuf(stderr, NULL, _IONBF, 0);

    float a, b, sm;
    int i = 2;

    printf("First number: \n");
    a = ask_loop(a);

    fflush(stdin);

    printf("Second number: \n");
    b = ask_loop(b);

    printf ("%.2f + %.2f = %.2f -> Summe \n", a, b, sm = a+b);
    printf("%.2f / %d = %.2f -> Mittelwert \n", sm, i, sm / i);
    printf("%.2f - %.2f = %.2f -> Differenz \n", a, b, a - b);
    printf("%.2f * %.2f = %.2f -> Produkt \n", a, b, a * b);
    printf("%.2f / %.2f = %.2f -> Division\n", a, b, a / b);
}

Здесь мы использовали функцию ask_loop(), которая проверяет, не возвращает ли scanf() код выхода. Если нет, это означает, что он успешно принял значение, в противном случае снова выполняется рекурсия. В конце функции он возвращает введенное число и присваивает переменной в main().

Пример вывода:

First number: // --- INPUT
abc
Error! Please input numbers correctly. // --- OUTPUT
2.0
Second number: // --- INPUT
5
2.00 + 5.00 = 7.00 -> Summe // --- OUTPUT 
7.00 / 2 = 3.50 -> Mittelwert
2.00 - 5.00 = -3.00 -> Differenz
2.00 * 5.00 = 10.00 -> Produkt
2.00 / 5.00 = 0.40 -> Division (5 -> 5.00)
...