用于读取浮点数的 scanf 无法按预期工作
scanf for reading float numbers doesn't work as expected
我从事编程 class 两周以来,在扫描键盘输入并将其分配给 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 机器上的 scanf()
之前添加一个 fflush(stdin)
但这对我不起作用(在 linux 环境中)。
我在这里看到了一些处理 linux 问题上的 fflush 的问题,但无法真正成功地为我的案例应用任何东西(这可能是因为我是一个完全的编码新手)。
有人可以帮忙吗?
老师采取的是“无法解决Linux问题,因为Windows是OS的选择”的方法,所以从那方面没有任何帮助。
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 位小数。
无论如何检查 scanf
的 return 值很重要:
On success, the function returns the number of items of the argument
list successfully filled. This count can match the expected number of
items or be less (even zero) due to a matching failure, a reading
error, or the reach of the end-of-file.
因为它可以避免代码上的错误。
我从事编程 class 两周以来,在扫描键盘输入并将其分配给 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 机器上的 scanf()
之前添加一个 fflush(stdin)
但这对我不起作用(在 linux 环境中)。
我在这里看到了一些处理 linux 问题上的 fflush 的问题,但无法真正成功地为我的案例应用任何东西(这可能是因为我是一个完全的编码新手)。
有人可以帮忙吗?
老师采取的是“无法解决Linux问题,因为Windows是OS的选择”的方法,所以从那方面没有任何帮助。
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 位小数。
无论如何检查 scanf
的 return 值很重要:
On success, the function returns the number of items of the argument list successfully filled. This count can match the expected number of items or be less (even zero) due to a matching failure, a reading error, or the reach of the end-of-file.
因为它可以避免代码上的错误。