gpt4 book ai didi

c - 带有精度说明符参数的 scanf

转载 作者:行者123 更新时间:2023-12-02 04:22:16 25 4
gpt4 key购买 nike

我刚开始学习C,因为混合了scanf和printf,所以不小心写了这样的代码:

    float loan = 0.0f; // loan
float rate = 0.0f; // monthly interest rate
float mpay = 0.0f; // monthly pay

printf("Enter amount of loan: ");
scanf("%.2f",&loan); // I am supposed to write scanf("%f",&loan), I was trying to take a float input with two digits after point

printf("Enter interest rate: ");
scanf("%.2f",&rate); // similar here

printf("Enter monthly payment: ");
scanf("%.2f",&mpay); // similar here

我预计这段代码会显示三个输入提示,每个提示都会挂起并等待,直到我键入一些输入并按 Enter 键。但发生的情况是,只有第一个提示在等待我的输入,然后当我按回车键时,第二个和第三个提示很快就会出现,而不等待我的输入,就好像代码从其他地方获取了我的输入一样。后来,当我检查应该保存三个输入的三个变量的值时,它们都没有实际存储输入值。

我回到我的 C 书,意识到我将 printf 的最小字段和精度参数概念与 scanf 混合在一起,所以我猜没有scanf 有这样的语法吗?但如果是这样,那么为什么编译器会编译,这是否意味着 scanf 也有这样的语法,或者我对此错了?我应该如何解释这种不等待第二个和第三个输入,也不将输入存储到三个变量中的奇怪行为?

最佳答案

是的,C 标准指定的 scanf() 系列不支持此功能。这是明确未定义的行为,这意味着任何事情都可以发生。

但是一些编译器确实实现了一个警告,在编译时检查格式字符串的有效性。 GCC(和 Clang)有 -Wformat (由 -Wall 启用,无论如何都应该使用)。如果您使用不同的编译器,则必须阅读其文档或使用静态分析工具。

摘自 ISO C11 委员会草案 (N1570),7.21.6.2 第 13 段:

If a conversion specification is invalid, the behavior is undefined. 287)

脚注引用 7.31.11 par。 1:

Lowercase letters may be added to the conversion specifiers and length modifiers in fprintf and fscanf. Other characters may be used in extensions.

因此 . 可以由 scanf() 实现作为扩展来支持,尽管我不知道有这样的扩展。

关于c - 带有精度说明符参数的 scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29630267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com