首页 > 解决方案 > 用于读取浮点数的 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 是首选操作系统”的方法,因此无法从那方面得到帮助。

标签: cscanffflush

解决方案


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

成功时,该函数返回参数列表中成功填充的项目数。由于匹配失败、读取错误或到达文件结尾,此计数可以与预期的项目数匹配或更少(甚至为零)。

因为它可以避免代码上的错误。


推荐阅读