C 具有输入检查和重试选项的函数

C 具有输入检查和重试选项的函数,c,function,pass-by-reference,C,Function,Pass By Reference,我想知道如何在函数getFloats中实现输入检查,以便在用户输入不需要的输入(例如,一个单词或字母而不是一个数字)时,该函数打印一条消息,并向用户提供重试的选项,该函数退出,而不提供重试输入的选项。停止使用scanf并开始使用更好的输入法是否更专业 #include <stdio.h> void getFloats(float *a, float *b); int main() { float num1,num2; getFloats(&num

我想知道如何在函数getFloats中实现输入检查,以便在用户输入不需要的输入(例如,一个单词或字母而不是一个数字)时,该函数打印一条消息,并向用户提供重试的选项,该函数退出,而不提供重试输入的选项。停止使用scanf并开始使用更好的输入法是否更专业

#include <stdio.h>

void getFloats(float *a, float *b);

int main()
{
    float num1,num2;
    
    getFloats(&num1,&num2);
    printf("%.2f and %.2f\n", num1, num2);
    
    return 0;
}

void getFloats(float *a, float *b)
{
    puts("Enter numbers:");
    scanf("%f", a);
    if ( scanf("%f", a) == 0)
    {
        puts("try again");
        scanf("%f", a);
    }
    else
    {
        scanf("%f", b);
    }
}
#包括
void getFloats(float*a,float*b);
int main()
{
浮点数num1,num2;
获取浮点值(&num1和&num2);
printf(“%.2f和%.2f\n”,num1,num2);
返回0;
}
void getFloats(float*a,float*b)
{
放入(“输入数字:”);
scanf(“%f”,a);
如果(扫描频率(“%f”,a)==0)
{
放置(“重试”);
scanf(“%f”,a);
}
其他的
{
scanf(“%f”,b);
}
}
关于

scanf("%f", a);
if ( scanf("%f", a) == 0)
  • 这是对同一变量调用两次
    scanf()
  • 最好检查一个积极的条件
  • 以下是建议的代码:

    #include <stdio.h>
    #include <stdlib.h>
    ...
    
    void getFloats(float *a, float *b)
    {
        puts("Enter numbers:");
    
        if( scanf( "%f %f", a, b ) != 2 )
        {
            fprintf( stderr, "scanf failed\n" );
            exit( EXIT_FAILURE );
        }
    }
    
    #包括
    #包括
    ...
    void getFloats(float*a,float*b)
    {
    放入(“输入数字:”);
    如果(扫描频率(“%f%f”,a,b)!=2)
    {
    fprintf(stderr,“scanf失败\n”);
    退出(退出失败);
    }
    }
    

    反复调用
    scanf()
    不太可能解决问题,因为问题仍然存在于
    stdin
    流中

    我从不使用
    scanf()
    。我更喜欢阅读整行代码,然后使用
    strtol()
    strtof()
    函数族。在不检查返回值的情况下使用
    scanf
    是不安全的。有关更多信息,请参见本页:上面我的链接评论中的页面还解释了何时适合使用
    scanf
    ,何时
    fgets
    更好。@AndreasWenzel这篇文章是一个令人难以置信的建议。非常感谢。