2011-11-03 52 views
1

我试图让代码检查用户输入是否在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]; 
     } 
    } 
} 

回答

6

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

2

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

int temp = 0; 

for (int i = 0; i < 20; i++) 
{ 
    cin >> temp; 
    if ((temp <= 100) && (temp >= 10)) 
    numlist[i] = temp; 
} 
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的λ,我也用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只是让你像其他序列一样对待它们,这确实需要一点时间。

+0

这是...很聪明。 –

+0

聪明......但我只是想,如果你想要一个过滤器,C++不是最好的语言来表达这... –

0

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

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

你可能也想'++我'的地方,但除此之外,我认为这是最接近到OP要求的内容。 –

+0

++我必须在这个循环之外,我只给了一个代码来接受相同的输入,只要它不符合约束。 –