我的疑问是从输入流中跳过“ .”并读取两个不同变量中的整数和小数部分。假设我有一个像 10.26 这样的输入,我想存储10在一个变量a和26另一个变量中b。
在C,使用scanf,我会这样做
scanf("%d.%d",&a,&b);
C++使用的等效方法是什么cin?还是我应该包含cstdio并使用它scanf本身?
我的疑问是从输入流中跳过“ .”并读取两个不同变量中的整数和小数部分。假设我有一个像 10.26 这样的输入,我想存储10在一个变量a和26另一个变量中b。
在C,使用scanf,我会这样做
scanf("%d.%d",&a,&b);
C++使用的等效方法是什么cin?还是我应该包含cstdio并使用它scanf本身?
您可以正常读取浮点数并使用 C-library 的modf函数来拆分数字:
#include <cmath>
float f = 0.0;
float ipart = 0.0;
float fpart = 0.0;
if (cin >> f)
fpart = modf(f, &ipart);
else {
// input failed
}
让我们operator>>做错误检查!
您仍然可以scanf在 C++ 中使用。如果要使用cin,则可以使用ignore跳过.输入中的 。像往常一样将整数读入变量:
cin >> a;
cin.ignore(1, '.');
cin >> b;
请注意,无论您使用什么,都会丢失有关小数部分的信息。值是.1还是.001,完成后你会发现b == 1。不过,它们是非常不同的价值观。
这是一种方法:
int egral;
unsigned int frac;
char sep;
if (!(std::cin >> egral >> sep >> frac) || sep != '.')
{
// error, could not parse number
}
// integral part is 'egral, fractional part in 'frac'
请注意,这会(错误地?)解析1.5E2为1 + 0.5,而不是150 + 0。您必须添加额外的逻辑来处理科学记数法的情况。读取实际的 float 并使用modf.