Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当要求用户输入2个数字时,会发生无限while循环_C++_Do While - Fatal编程技术网

C++ 当要求用户输入2个数字时,会发生无限while循环

C++ 当要求用户输入2个数字时,会发生无限while循环,c++,do-while,C++,Do While,我正在尝试实现一个简单的游戏,其中要求用户提供2个介于0和10之间的有效整数坐标。(int行,int列) 我会意识到的一个例子是: 插入坐标:4C *错误,行数和列数必须为整数 插入坐标:44 2 *错误,行数或列数太高 插入坐标:4 3 您输入的坐标是(4,3) 我通过一个“边做边做”的循环实现了所有这些 int r,c; do{ cout<<"Insert coordinates: "; cin>>r>>c; if (cin.fail()) {

我正在尝试实现一个简单的游戏,其中要求用户提供2个介于0和10之间的有效整数坐标。(int行,int列)

我会意识到的一个例子是:

插入坐标:4C
*错误,行数和列数必须为整数

插入坐标:44 2
*错误,行数或列数太高

插入坐标:4 3
您输入的坐标是(4,3)

我通过一个“边做边做”的循环实现了所有这些

int r,c;
do{
cout<<"Insert coordinates: ";
cin>>r>>c;
    if (cin.fail())
{
    cout << "ERROR: Number of row and column must be integer." << endl << endl;

}
    if ((r<0 || r>10) || (c<0 || c>10)
{
    cout << "*Error, number of row or column are too high [0-10]" << endl << endl;

}
 cout<<endl;
}
while (((r<0 || r>10)||(c<0 || c>10)) || cin.fail());
intr,c;
做{
coutr>>c;
if(cin.fail())
{

cout如果您输入的是字母而不是数字,则该字母不会从输入缓冲区中提取,因此您的代码将永远失败

如果输入失败(为什么不使用例如
If(!(cin>>r>>c))
?),则可以通过调用函数跳过该行:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
((r10)| |(c10))| | cin.fail());
改为

 (((r>0) && (r<10))||((c>0) && (c<10)))     //It will work, no need to check cin.fail();

((r>0)和&(r0)和&(c您可以简单地检查是否输入了字符,例如:

if (x >= 0x41 && x <= 0x7A)
cout<<"error, you entered a letter";

如果(x>=0x41&&x程序进入无限循环,因为您从未清除失败状态。您可以简化您的:

#包括
使用名称空间std;
int main()
{
int r=-1;
int c=-1;
bool valid=false;
做
{
cout r>>c)
{

如果(r>=0&&r=0&&c如果用户输入了错误的值,您希望它做什么?不确定它是否影响它,但如果((r10)| |(c10)
cin.fail()行上缺少一个结束括号如果输入字符,则不会触发
。这可能会有所帮助:@Samoth如果由于输入字母而不是数字而导致提取失败,则会设置
failbit
。您可能需要检查,例如,您的代码,如果我输入例如“a 4”,则do while将进入无限循环.:/It没有。它将再次循环询问您的输入(因为您的第一次输入失败),清除状态,然后让您重试,直到输入有效的输入。尝试编译并运行!如果我输入的数字大于10,则结束循环,同时我会要求用户另一个输入。如果我输入了字符,则进入循环。您刚才所说的毫无意义。这仅在您输入0和10之间(含10)的有效数字时才会中断循环。我想我确实忘了转置
cin。忽略
调用。在编译的示例中修复了此问题。将其从输入流中拉出并放入另一个输入流以进行读取有点过分。@ZacHowland并不总是这样,它可以简化事情,特别是当您不再存在
std::cin
流将获得<代码>故障位
设置为错误输入,或者某些字符将在输入缓冲区中停留。
 (((r>0) && (r<10))||((c>0) && (c<10)))     //It will work, no need to check cin.fail();
if (x >= 0x41 && x <= 0x7A)
cout<<"error, you entered a letter";
#include <iostream>
using namespace std;

int main() 
{
    int r = -1;
    int c = -1;
    bool valid = false;
    do
    {
        cout<<"Insert coordinates: ";
        if (cin >> r >> c)
        {
            if (r >= 0 && r <= 10 && c >= 0 && c <= 10)
            {
                valid = true;
            }
        }
        else
        {
            cin.clear();
            cin.ignore();
        }

        if (!valid)
        {
            cout << "ERROR:  Number of row and column must be an integer between 0 and 10." << endl;
        }
    } while (!valid);

    cout << "You entered (" << r << ", " << c << ")" << endl; 

    return 0;
}