【问题标题】:Error regarding a simple C program involving scanf()关于涉及 scanf() 的简单 C 程序的错误
【发布时间】:2021-10-20 17:55:03
【问题描述】:
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
int main() {
    double NET_Income = 9999.58;
    printf("Enter your NET monthly income: ");
    scanf("%f", &NET_Income);

    while (NET_Income < 500.00) OR (NET_Income > 400000.00); {
        printf("Sorry, that is an incorrect amount, please re-enter your NET monthly income: ");
        scanf("%f", &NET_Income);
    }
    return 0;
}

当我尝试在 Visual Studio 中运行此代码时,出现以下错误:

忽略返回值:'scanf'

警告 C4477 'scanf':格式字符串 '%f' 需要一个类型为“float *”的参数,但可变参数 1 的类型为“double *”

警告 C4013 'OR' 未定义;假设 extern 返回 int

'scanf' : format string '%f' requires an argument of type 'float *', but variadic argument 1 has type 'double *

【问题讨论】:

  • C 中没有OR 运算符,它是||
  • double 的格式运算符是 %lf,而不是 %f
  • 改用%lf
  • or&lt;iso646.h&gt; ...
  • 它是 C,而不是 Python。

标签: c scanf


【解决方案1】:

这段代码有不少问题:

  • 如 cmets 中所述,doublescanf 格式说明符是 %lf,而不是 %f

  • scanf的返回值表示函数是否成功,需要检查(documentation)

  • while (NET_Income &lt; 500.00) OR (NET_Income &gt; 400000.00); { 包含几个错误,包括使用OR(不存在)和一些不需要的额外括号。此外,您不希望在其中使用分号,尽管这可能只是一个错字。反正应该是:while (NET_Income &lt; 500.00 || NET_Income &gt; 400000.00) {


cmets 中关于scanf 的返回值提出了一些观点,所以我想我会澄清一下。 cppreference 将其定义为:

成功分配的接收参数数(如果在分配第一个接收参数之前发生匹配失败,则可能为零),如果在分配第一个接收参数之前发生输入失败,则为 EOF。

其中“输入失败”表示输入字符不可用,“匹配失败”表示输入不合适(例如,在这种情况下,不是数字)。

因此,在这种情况下,由于我们一次只扫描一个参数,返回值1 表示成功,其他任何值都表示失败。如果scanf 失败,您可能会尝试某种恢复策略,但这超出了本问题的范围。

【讨论】:

  • scanf 返回成功扫描的输入数。在这种情况下,它应该在成功时返回 1。它可能不会返回错误。如果它以某种方式扫描输入并且没有找到任何值,它可能会返回 0。它可以返回 EOF。这不是典型的 ANSI 成功或错误函数。
  • @bruceg 当然。在发布的代码中,我将1 归类为“成功”。
  • Re “scanf 的返回值表示函数是否成功”:scanf 的返回值表示分配了多少个输入项,或者在第一次转换之前发生了错误。返回值小于项目的全部数量不一定是失败,因为scanf 可用于决定如何进一步解析,而不是决定输入失败,返回值的全部数量items 并不表示所有匹配都成功,因为可能存在不匹配的文字或带有抑制分配的转换说明符。
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多