【问题标题】:ANSI C: Error checking user input with a functionANSI C:使用函数检查用户输入时出错
【发布时间】:2015-01-30 04:21:58
【问题描述】:

我正在尝试使用单个错误检查函数来检查多个其他函数中的错误。但是,在运行程序时,它会卡在一个循环中并且不会从中中断。一旦应用程序获得有效输入,它应该继续执行下一个函数。然而,即使错误检查返回 0,它也会重复 fStartBalance 函数。我是一个初学者,所以我不太擅长故障排除。这是适用的代码:

/* Begin fValidateFloat */
int fValidateFloat(float input, float minValue, float maxValue)
{
    int failed = 0;

    while (input < minValue)
    {
        printf("\nError: Input too low, please enter a value greater than or equal to %.2f.", minValue);
        failed = 1;
        return failed;
    }
    while (input > maxValue)
    {
        printf("\nError: Input too high, please enter a value less than or equal to %.2f.", maxValue);
        failed = 1;
        return failed;
    }
} /* End fValidateFloat */

/* Begin fStartBalance */
float fStartBalance(void)
{
    float startBalance; /* Declare variable */
    int failed;

    while (failed = 1)
    {
        printf("\n\nNow enter your current balance in dollars and cents: "); /* Prompt user to input current balance */
        scanf("%f", &startBalance);
        fflush(stdin);
        failed = fValidateFloat(startBalance, 0, 3.4e+38);
    }

    return startBalance; /* Return variable */
} /* End fStartBalance */

感谢您的帮助。

【问题讨论】:

  • 查看while 循环:您想检查failed 是否等于1。但是,您将其设置为1!请改用failed == 1
  • 记得打开所有警告。如果你使用gcc,至少使用-Wall。它会警告你一些愚蠢的错误,比如你的failed = 1 错字。
  • 函数中的'while'语句:fValidateFloat从不循环执行,所以最好写成'if'语句
  • 关于 @Riley 的 while 循环(之前评论过),变量 'failed' 未初始化为任何特定值(只是该地址的堆栈上发生了什么。建议:设置声明时将“失败”变量设置为某个已知值。这也是为什么文字应该位于左侧的一个主要示例,因此编译器会捕获这些类型的错误,因此您不必这样做。
  • 对 scanf 的调用需要注意:1) 格式字符串需要一个前导 ' ' 来消耗空格,如前面的换行符 2) 需要检查返回的值以确保操作/格式转换成功

标签: c function error-handling ansi


【解决方案1】:

fflush(stdin); 未定义

在没有使用 while 语句的情况下,您永远不会从 fValidateFloat() 返回任何值:

        return failed;
    }
} /* End fValidateFloat */

在同一个函数中,while 循环没有任何意义,请改用 if 语句:

while (input < minValue)
{
    printf("\nError: Input too low, please enter a value grea%.2f.", minValue);
    failed = 1;
    return failed;
}

您在 while 循环中将 failed 设置为 1,而不是将其与 1 进行比较:

while (failed = 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多