2013-02-15 67 views
0

函数require()中的循环需要3个条件,a> b或“a”或“b”不是数字。即使我不满足条件并放入2个整数,它只是再次循环。布尔条件在do-while循环中无法正常工作

另外,当我把一个字符,然后它只是无休止地循环“输入最小数字输入最大数量”忽略了cins。有人知道为什么我是初学者所以这可能是真的很明显

#include <iostream> 
#include <cmath> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 

int random(int minN, int maxN) //generates random number within specified range 
{ 
    srand (time(NULL)); 
    int x = (maxN - minN); 
    int y = minN + (rand() % (x+1)); 
    return y; 
} 

int require()  //makes sure a < b and both are digits 
{ 
    int a,b; 
    do { 
    cout << "Enter minimum number" << endl; 
    cin >> a; 
    cout << "Enter maximum number. Note: Has to be greater or equal to minimum." << endl; 
    cin >> b; 
    } while (a > b || !isdigit(a) || !isdigit(b)); 

    return random(a,b); 
} 

int main() 
{ 
    cout << require() << endl; 
} 
+0

对不起,我的措辞 – Foxic 2013-02-15 06:21:34

+1

'isdigit'是测试人物。如果您将整数作为参数传递,它会将它们解释为特定编码下的字符(取决于区域设置)。 – jogojapan 2013-02-15 06:22:31

+0

另外,当我满足条件时,你又指什么意思,再次循环_。这就是do-while循环的工作原理:只要条件满足,它就会循环。当条件不再满足时停止。 – jogojapan 2013-02-15 06:24:16

回答

1

你不应该使用isdigit,因为这涉及到一个特定的字符是数字。取而代之的是循环应该是这样的:

int require()  //makes sure a < b and both are digits 
{ 
    validNumbers = true; 
    do 
    { 
     cout << "Enter minimum number" << endl; 
     cin.clear(); 
     cin >> a; 
    } while (cin.fail()); 

    do 
    { 
     cout << "Enter maximum number. Note: Has to be greater or equal to minimum." 
      << endl; 
     cin.clear(); 
     cin >> b; 
    } while (cin.fail() || a > b); 

    return random(a,b); 
} 

PS:你只需要在程序开始调用一次srand (time(NULL));

+0

这正是我所寻找的,非常感谢 – Foxic 2013-02-15 06:38:39

1

您正在阅读的数字作为,以及,数字不是字符作为isdigit功能的期望。如果您使用的是C++ 11兼容标准库,则如果输入不是有效的整数,则ab的值实际上为零,这意味着例如!isdigit(a)将是true。如果您使用的是非C++ 11库,则ab的值将是随机的,并且很可能会导致!isdigit(a)为真,以及完整的32位整数中的有效数字ASCII值的数量范围很小。


如果你看了一则关于输入操作的参考,像this one你会看到,如果提取失败,则流failbit将被设置。这可以测试“内联”是这样的:

if (!(std::cin >> a)) 
{ 
    std::cout << "Not a valid number, try again: "; 
    continue; 
} 

或者也可以使用流fail功能进行测试。

+0

我明白了,我能做些什么呢?我不太懂,但会像atoi一样工作? – Foxic 2013-02-15 06:27:09

+0

@Foxic请参阅我的更新回答 – 2013-02-15 06:31:29

+0

谢谢,我以为我不知道这一点是愚蠢的,但我只是没有学到足够的语法 – Foxic 2013-02-15 06:35:34