【问题标题】:Prevent letters or numbers below 0 from being entered防止输入小于0的字母或数字
【发布时间】:2014-04-25 03:31:17
【问题描述】:

我正在尝试使其无法输入低于 0 的字母或数字。但是如果我输入一个字母,我会得到一个无限循环。

这就是我现在拥有的

int DiskCylCur [DiskDevices];
for (int i = 1; i<=DiskDevices; i++)
{
    int input = 0;
    cout << "Enter the number of Cylenders for Disk " <<  i << " : ";
    cin >> input;
    DiskCylCur[i] = input;
}

为什么会这样?

【问题讨论】:

  • 你应该使用stringstream
  • C++ 中的数组是从零开始的,仅供参考。您不应该填充从1DiskDevices 的元素,因为DiskCylCur[DiskDevices] 会踩到最后一个索引的内存,因为它超出了范围。
  • 这里不能存在无限循环(如果我们不考虑由于@Cyber​​ 提到的越界访问而导致的未定义行为),因为输入未在循环的控制块,您没有向我们展示完整的代码,我怀疑其他地方正在发生某些事情。请提供可重现的测试用例。
  • 尝试先阅读这篇文章。 parashift.com/c++-faq/istream-and-ignore.html 在您的示例中,我看不到任何无限循环的可能性,但该链接应该有助于回答您有关忽略不需要的输入的问题。
  • 对于小于零的问题,只需使用unsigned

标签: c++ for-loop io


【解决方案1】:

只需使用一个while循环和一个测试。

bool ok = false;
while(ok) {
    if (input > 0) {
        ok = true;
    }
}

【讨论】:

    【解决方案2】:

    当您输入字母而不是数字时,cout 不会读取数字并且字母会留在输入流中。

    要检测此类错误,请读取字符串,然后将字符串转换为 int。

    std::string s;
    cin >> s;
    int input;
    if ( sscanf(s.c_str(), "%d", &input) == 1 )
    {
      // Got a number. Use it.
    }
    

    【讨论】:

    • 这里不能无限循环,因为循环的控制块中没有用到输入。
    • 你是说cin?我在示例中看不到任何会导致无限循环的内容。
    • @Joky 和 ​​shawn1874,无限循环部分是一个疏忽。修正了答案。
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多