【发布时间】:2013-04-29 10:58:55
【问题描述】:
是否可以在 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,它会通过将浮点数 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 它会返回错误条件。我们可以为float 条目实现相同的目标吗?
谢谢
【问题讨论】:
-
读取一个字符串并进行自己的转换。
-
@Koushik dude .. 看看这个 .. 你对 I/O 流类感到困惑 ...parashift.com/c++-faq-lite/istream-and-ignore.html
-
@sftrabbit 如果您输入任何字符 - 假设我输入
'j'或'hello'- 然后对于表达式'cin >> var'将设置返回的istream&失败位 - 它评估为 @987654334 @ asvar类型为int -
@Koushik 也检查this
-
请注意,没有“隐式转换”之类的东西。 cast 是您在代码中编写的内容,用于告诉编译器进行 conversion。 隐式转换是编译器在没有强制转换的情况下进行的转换; 显式转换是编译器由于强制转换而执行的转换。
标签: c++