2

是否可以在 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 >> varvar 类型的方式int- 如果我们输入char它返回错误条件。我们可以为floatentry 实现相同的目标吗?

谢谢

4

2 回答 2

6

但如果用户输入 9.5,它会通过将浮点数 9.5 转换为 9 并将其存储在 var 中来接受它。

不,它没有。如果用户输入9.5,则cin >> var在点击 时停止阅读.(并将其留在流中)。没有浮点到整数的转换,因为您没有阅读 a float,只是阅读了int.

解决方法是读取输入的其余部分(在 之后cin >> var),并确保在int.

于 2013-04-29T11:40:35.560 回答
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
}
于 2013-04-29T11:04:49.663 回答