如何为此代码创建检查?

时间:2011-11-03 20:16:27

标签: c++ constraints

我正在努力使代码检查用户输入是否介于(和包括)10和100之间。

如此习惯于单一输入,我遇到麻烦,因为它是一个数组...

int main()
{
    int numlist[20];

    for(int i = 0; i < 20; i++)
    {
        cout << "Enter # " << i + 1 << " : ";

        // here is where I am going wrong... 

        if ((numlist[i] <= 100) && (numlist[i] >= 10))
        {
            cin >> numlist[i];
        }
    }
}

4 个答案:

答案 0 :(得分:6)

你不应该在测试cin >> numlist[i] 之前输入输入语句if ((numlist[i] <= 100) && (numlist[i] >= 10)) 吗?

答案 1 :(得分:2)

看起来你想做这样的事情:

int temp = 0;

for (int i = 0; i < 20; i++)
{
  cin >> temp;
  if ((temp <= 100) && (temp >= 10))
    numlist[i] = temp;
}

答案 2 :(得分:2)

只是提供一种稍微不同的方式,您可以考虑使用vector而不是数组,并使用istream_iterator和标准算法读取数据:

std::vector<int> numlist;

std::remove_copy_if(std::istream_iterator<int>(std::cin), 
                    std::istream_iterator<int>(),
                    std::back_inserter(numlist), 
                    [](int i)->bool { return i<10 || i > 100; });

编辑:我想因为我正在使用C ++ 11 lambda,所以我也可以使用C ++ 11 copy_if,它更直接地表达了意图:

std::copy_if(std::istream_iterator<int>(std::cin), 
             std::istream_iterator<int>(),
             std::back_inserter(numlist), 
             [](int i)->bool { return i>=10 && i<=100; });

就“聪明”而言,这根本不是意图 - 相反,所需要的是对原始意图的简单直接表达:将标准输入中的(过滤的)数据复制到容器中。它需要一点时间来习惯将文件视为容器的想法(尤其是像std::cin这样的通常是交互式的),但最终文件是一个序列,istream_iterator / ostream_iterator让你像对待它们一样其他序列。

答案 3 :(得分:0)

正如其他人所说,你无法检查你甚至没有读过的值(来自用户)。 要约束输入,必须在do while循环内检查cin之后的输入,只要它不满足约束。

do
{
    //you might cout here
    cin >> numlist[i];
}
while ((numlist[i] > 100) || (numlist[i] < 10));