c - 用于读取浮点数的 scanf 无法按预期工作
问题描述
自两周以来,我一直在上编程课,并且在扫描键盘输入并将其分配给 C 中的变量时遇到了一些麻烦。
#include <stdio.h>
#include <stdlib.h>
int main()
{
float creditSum, interestRate, repayment;
system("clear");
printf("\n please enter the total Credit sum: ");
scanf("%.2f", &creditSum);
printf("\n Please enter the interest rate: ");
scanf("%.2f", &interestRate);
printf("\n Please enter the monthly repayment amount: ");
scanf("%.2f", &repayment);
printf("\n\n %.2f | %.2f | %.2f\n\n", creditSum, interestRate, repayment);
return 0;
}
我可以编译运行程序,但我得到了
user@db10:~/$ ./credit
please enter the total Credit sum: 100
Please enter the interest rate:
Please enter the monthly repayment amount:
0.00 | 0.00 | 0.00
所以我仍然可以输入 3 个值中的第一个,它没有按计划分配给变量。
课程老师让每个人都在 Windows 机器上添加一个fflush(stdin)
,scanf()
但这对我不起作用(在 linux 环境中)。
我在这里看到了一些处理 linux 上的 fflush 问题的问题,但不能真正成功地为我的案例应用任何东西(这可能是因为我是一个完全的编码新手)。
有人可以在这里帮忙吗?
老师采取“无法解决 Linux 问题,因为 Windows 是首选操作系统”的方法,因此无法从那方面得到帮助。
解决方案
scanf
捕获非预期的输入格式。
正确的代码应该是这样的:
#include <stdio.h>
#include <stdlib.h>
int main()
{
float creditSum, interestRate, repayment;
system("clear");
printf("\n please enter the total Credit sum: ");
if(scanf("%f", &creditSum)!= 1) return -1;
printf("\n Please enter the interest rate: ");
if(scanf("%f", &interestRate)!= 1) return -1;
printf("\n Please enter the monthly repayment amount: ");
if(scanf("%f", &repayment)!= 1) return -1;
printf("\n\n %.2f | %.2f | %.2f\n\n", creditSum, interestRate, repayment);
return 0;
}
您可能不想只捕获浮点数的 2 位小数。你想取浮点数,然后只用 2 个小数打印它。
在任何情况下检查返回值都很重要scanf
:
成功时,该函数返回参数列表中成功填充的项目数。由于匹配失败、读取错误或到达文件结尾,此计数可以与预期的项目数匹配或更少(甚至为零)。
因为它可以避免代码上的错误。
推荐阅读
- django - 如何在没有 AuthMiddlewareStack 的情况下使用 Django 频道进行公共聊天?
- hive - 在 Hive 中选择最大客户 ID
- amazon-web-services - 通过 AWS SNS 主题发送速率限制
- javascript - 重新验证码 v3 集成
- java - Maven NAR 插件 + webapp 中的 Spring boot,在 Tomcat 中加载 .nar 工件
- python - 具有多个 x 轴标签的 pandas 数据框条形图
- jmeter - 文件需要电子签名的负载测试应用程序
- gnu-screen - 如何在 GNU 屏幕中查看 hardstatus 的当前值
- cordova - 离子深层链接 - 如果未安装应用程序,则重定向到网站
- r - `dplyr:::bind_rows_` 有什么作用?