只读取浮点数并拒绝整数和字符(a.b,c 等)直到正确

Read only floating numbers and reject integer and characters (a.b,c etc.) until correct

我正在尝试用 C (gcc) 编写代码以仅接受浮点数并拒绝整数、特殊字符、字母数字条目。

我想让它看看 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); 





}

感谢您的宝贵时间!

整数将被转换为浮点数,即如果给定数字 5 那么它将被隐式转换为浮点变量的 5.0 。因此,none应该担心这一点。

使用以下程序:

#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() 是否没有 returns 退出代码。如果没有,则表示接受成功,否则再次递归。在函数的最后,它 returns 将输入的数字赋值给 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)

您可以使用 scanf() 的 return 值来检测错误输入。 (参见 fscanf() documentation)。

然后你需要明确地忽略错误的输入(例如通过扫描 "non-newline" 而忽略它),以便之后能够从用户那里获得更正的输入。这并不容易,见文末链接
如此循环,直到满意为止。

或者(在 Whosebug 上广泛推荐的方法)通过 fgets() 将整行读入缓冲区,然后通过解析确定正确性。
跳过不正确的语法,只需将下一行读入缓冲区即可。
如果正确,从缓冲区扫描。

关于该主题的有用文章:beginners guide away from scanf()