Как зациклить scanf_s () до успеха? - PullRequest
0 голосов
/ 13 июня 2018
#include <stdio.h>

int main(){

    float x,y;

    printf("Enter 2 numbers: \n");
    scanf_s("%f %f", &x, &y);

    if (getchar() == '\n')
    {
    printf("Division: %f\n", x / y);
    printf("Product: %f\n", x * y);
    printf("Sum: %f\n", x + y);
    printf("Difference: %f\n", x - y);
    }
    else
    {
        printf("no Float-Value!");
    }

getchar();
return 0;
}

нам нужно включить цикл, поэтому, если мы введем неправильный формат, программа должна снова запросить ввести два числа

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Что мне не нравится в использовании семейства функций scanf, так это то, что он может привести в бешенство и вывести из строя вашу программу, если вы введете что-то не так.Например, если у вас есть scanf("%f", &a), попробуйте ввести stack overflow.Это сходит с ума!

Итак, как я уже сказал в комментариях, я думаю, что вы должны создать свою собственную функцию проверки и получить пользовательский ввод в виде строки, используя fgets.

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

#include <stdio.h>  /* printf, fgets */
#include <ctype.h>  /* isdigit, isspace */
#include <string.h> /* strlen */

int is_valid_float(char *s, int len)
{
    int i;

    for(i = 0; i < len; i++) {
        /* floats may have a decimal point */
        if(s[i] == '.') continue;

        /* spaces should be ignored, since they separete the nubmers */
        if(isspace(s[i])) continue;

        /* is there's anything besides a number, we abort */
        if(!isdigit(s[i])) return 0;
    }

    /* if we got here, then the input contains two valid floats.
     * 
     * Does it? Test it!
     */
    return 1;
}


int main(void)
{
    float a, b;
    char buf[100];
    int len;

    do {
        fprintf(stderr, "Enter A and B: ");
        fgets(buf, sizeof buf, stdin);

        /* fgets will store a newline at the end of the string, we
         * just overwrite it with a null terminator
         *
         * Thanks to @chux for the strcspn() suggestion.
         */
        buf[strcspn(buf, "\n")] = 0;    
    } while(!is_valid_float(buf, len));

    /* now, after we know the string is valid and won't cause scanf to go
     * berserk, we can use it in our validated string.
     *
     * Here is where you should really take a moment and look at the
     * validation function and improve it. Not valid strings will cause
     * your program to go nuts.
     */
    sscanf(buf, "%f %f", &a, &b);

    /* Did it scan the numbers correctly? */
    printf("A: %f\n", a);
    printf("B: %f\n", b);

    return 0;
}
0 голосов
/ 13 июня 2018

Лучший способ проверить правильность ввода - это проверить возвращаемое значение scanf_s, которое сообщает вам количество переменных, которые были успешно установлены.В вашем случае, если это 2, то все хорошо;в противном случае вам нужно повторить.

Другими словами

do {
    int c;
    while ((c = getchar()) != '\n' && c != EOF); // clear the input stream
    printf("Enter 2 numbers: \n");
} while (scanf_s("%f %f", &x, &y) != 2);

- это подходящая структура управления, а не if (getchar() == '\n'), которую вы должны отбросить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...