【问题标题】:Unsigned long long variable initialized with negative valueUnsigned long long 变量初始化为负值
【发布时间】:2015-03-04 10:32:19
【问题描述】:

用户输入一个值(通过<iostream>)到 unsigned long long 变量。如何检测输入变量是否为负?输入流保持在good()state。我可以不使用额外的string 变量吗?

unsigned long long SafeInput(){
    unsigned long long buffer = 0;
        while (!(cin >> buffer) || cin.get() != '\n')
        {
            cout << "Error. Input again: ";
            cin.clear(); 
            cin.sync();
        }
    return buffer;
}

【问题讨论】:

  • 你不能把它静态转换成signed long long吗?
  • 你可以用一个额外的有符号变量来做到这一点。
  • signed long long 剪切正变量。范围是unsigned 的两倍。这是一个糟糕的解决方案。

标签: c++ variables iostream long-integer


【解决方案1】:

你不能,至少不能直接。由于各种历史原因,C++ 即使在输入无符号值时也允许减号。最好的你 可以做的是在读取字段之前检查:

input >> std::ws;       //  Skips white space
if ( input.peek() == '-' ) {
    //  Input begins with minus sign...
}
//  Do input.

值转换后,有关文本的信息 生成它已经丢失了。

【讨论】:

  • 我已经添加了一个代码来检查输入是否是一个数字,你知道吗,我怎样才能将你的片段添加到我的代码中以检测负数?例如,如果它是否定的,程序应该显示一条消息“错误”并要求再次输入。
  • @Jack 上面的代码(在你输入数字之前执行)检查用户是否输入了减号。
  • “输入”是什么意思?我应该用“cin”替换它吗?反正要么是未识别,要么是导致栈溢出异常
  • @Jack input 是您碰巧从中读取的任何 istream。 (除了在玩具程序中,它不会是std::cin,而是函数的一些std::istream&amp; 参数。)
【解决方案2】:

如果您希望用户能够使用unsigned long long的全部范围,那么您有两种选择:

  1. 使用字符串并解析它
  2. 使用更大的(有符号)整数类型(可能需要一些特殊的库来处理 128 位整数)

否则,您可以将变量视为已签名的long long 并测试最高有效位(或临时转换并执行“正常”比较)。

【讨论】:

    【解决方案3】:

    cin 期望无符号时输入负数会设置流的失败状态,您可以通过cin.fail() 查询。

    但是输入大于ULLONG_MAX的数字也会设置失败状态,所以你无法通过cin.fail()判断用户输入的值是过小还是过大。

    如果您只想检测负输入,则需要使用字符串作为辅助变量,如UniversE 所述。

    【讨论】:

    • cin.fail() 标志不会被设置,这就是问题所在。我正在寻找可以在没有string var 的情况下执行的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多