【问题标题】:function with input check and retry option具有输入检查和重试选项的功能
【发布时间】:2020-10-01 02:53:07
【问题描述】:

我想知道如何在函数 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);
    }
}

【问题讨论】:

  • 我从不使用scanf()。我更喜欢阅读整行,然后使用strtol() 和strtof() 系列函数。
  • 不检查返回值就使用scanf是不安全的。有关详细信息,请参阅此页面:A beginners' guide away from scanf()
  • 我上面链接的评论中的页面也说明了什么时候使用scanf比较合适,什么时候使用fgets比较好。
  • @AndreasWenzel 那篇文章是一个令人难以置信的建议。谢谢

标签: c function pass-by-reference


【解决方案1】:

关于;

scanf("%f", a);
if ( scanf("%f", a) == 0)
  1. 这是为同一个变量调用两次scanf()
  2. 最好检查阳性情况。

这是一个建议的代码:

#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 );
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多