是否可以在C / C ++中禁用隐式转换。
假设我想写一个有效性函数,只让我输入integers in range [1,10]
我写道:
#include <iostream>
using namespace std;
int main( )
{
int var=0;
cout << "Enter a number (Integer between 1 to 10) : ";
while( (!(cin >> var )) || (var > 10 ) || (var < 1) )
{
cout << "U nuts .. It can only be [1,10]\n";
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
cout << "Enter a number (Integer between 1 to 10) : ";
}
cout << "\nYou entered : " << var;
return 0;
}
但是如果用户输入9.5,则通过将float 9.5转换为9并将其存储在var中来接受它。我希望任何浮动条目都被视为无效条目。我如何最紧凑地实现这一目标。
我不想做这类事情:
#include <iostream>
#include <cmath>
using namespace std;
int main( )
{
float var=0;
cout << "Enter a number (Integer between 1 to 10) : ";
while( (!(cin >> var )) ||(var < 1)|| (var > 10 ) || !(ceilf(var) == var) )
{
cout << "U nuts .. It can only be [1,10]\n";
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
cout << "Enter a number (Integer between 1 to 10) : ";
}
cout << "\nYou entered : " << var;
return 0;
}
这符合我的目的。但是我想知道的是,从float到int的转换有什么方法 - 我可以抑制它或者它可以将它显示为错误输入。
类似于cin >> var
,其中var类型为int
- 如果我们输入char
,则返回false条件。我们可以为float
条目实现相同的目标吗?
谢谢
答案 0 :(得分:6)
但是如果用户输入9.5,则通过将float 9.5转换为9并将其存储在var。
中来接受它
不,不。如果用户输入9.5
,则cin >> var
会在点击.
时停止阅读(并将其保留在流中)。没有浮点到空转换,因为您还没有读过float
,只读int
。
修复是读取输入的其余部分(在cin >> var
之后),并确保在int
结束后没有遗留任何错误。
答案 1 :(得分:1)
如果要验证所有输入,则必须先获得整行。
尝试:
string line;
getline(cin, line); // gets whole line
char *endptr;
long int var = strtol(line.c_str(), &endptr, 10); // converts string to int
// now check that endptr points to end of the string
if (endptr<line.c_str()+line.length()) {
// extra characters found after the integer
}