如何解决这个无限循环(做while循环)?

时间:2020-02-08 04:24:07

标签: c++

这是我的代码:

#include <iostream>
#include <cctype>
using namespace std;

int main()
{
    char c_row;
    int col;

    do{
        cout << "Enter the starting coordinates: ";
        cin >> c_row >> col;
        cin.ignore();
        cout << endl;
    }
    while(!(toupper(c_row) >='A' && toupper(c_row) <= 'J') ||
           !(col>=1 && col <= 10) );

    cout << "right input !!" << endl; 

    return 0;
}

我想让用户在下面的图形上输入一个坐标(一个图形,其中行= A到J,col = 1到10)。如果用户输入了错误的输入,程序将再次询问,直到用户输入正确的输入。

the graph image

当无效输入为“ z11”,“ A0”,“ 31241”时有效。

the output with these input

但是当无效输入为“ 8z”,“ uu”,“ abcde”时,它将导致无限循环。

the output with these input

我该如何解决这个问题,为什么会发生?

1 个答案:

答案 0 :(得分:0)

这里的问题是输入的顺序。行是char变量,列是int变量。在代码中,第一个字符为char,第二个输入字符为int。因此,程序可以正常工作,直到第一个输入字符为行,第二个输入字符为列(例如:-a5,b2),但是如果您通过提供列的第一行和第二行来更改输入顺序,则可以输入相关的ASCII字符所提供的列值存储在char变量c_row中,行的整数表示存储在int变量col中。因此程序变得疯狂。

因此,您有两个选择。以正确的顺序给出输入,而不会弄乱顺序(例如:-a2,b2,c2等)。或者,您可以编写程序以在正确的变量中存储正确的值,然后再检查输入是否正确。第二种选择如下所述。

用于对变量进行char存储两个输入值。在示例中,我使用了2个元素组成的数组。

char inputs[2];
cin >> inputs[0] >> inputs[1];

然后使用charisalpha(char c)方法检查哪个变量具有isdigit(char c)值和哪个变量具有数字。一个变量应为数字,而另一个则应为字母字符。任何其他组合均无效,请使用continue;

再次循环以再次获取输入
if(isdigit((char)inputs[0]) && isalpha((char)inputs[1])){
    //column is inputs[0] and row is inputs[1]
} 
else if (isalpha((char)inputs[0]) && isdigit((char)inputs[1]))
{
    //column is inputs[1] and row is inputs[0]
} else
{
    //invalid input combination, so iterate again.
    continue;
}

现在,您必须根据给定的输入为c_rowcol分配值。但是输入数组是char数组,因此您必须先将char解析为int,然后才能将值分配给col。我创建了一个名为str_to_int(char c)的方法来进行类型转换/值解析。

int str_to_int(char c) {
    string str = "";
    str += c;
    stringstream ss(str);
    int num;
    ss >> num;
    return num;
}

使用str_to_int(char c)方法将int的值分配给col,并将其他值分配给c_row。在上面的if语句中执行此操作。

if(isdigit((char)inputs[0]) && isalpha((char)inputs[1])){
    col = str_to_int(inputs[0]);
    c_row = inputs[1];
} 
else if (isalpha((char)inputs[0]) && isdigit((char)inputs[1]))
{
    col = str_to_int(inputs[1]);
    c_row = inputs[0];
} else
{
    continue;
}

好!现在该程序应该可以工作了。完整的代码如下。

#include <iostream>
#include<sstream>
#include <cctype>
using namespace std;

int str_to_int(char c) {
    string str = "";
    str += c;
    stringstream ss(str);
    int num;
    ss >> num;
    return num;
}



int main()
{
    char c_row;
    char inputs[2];
    int col;

    do{
        cout << "Enter the starting coordinates: ";
        cin >> inputs[0] >> inputs[1];


        if(isdigit((char)inputs[0]) && isalpha((char)inputs[1])){
            col = str_to_int(inputs[0]);
            c_row = inputs[1];
        } 
        else if (isalpha((char)inputs[0]) && isdigit((char)inputs[1]))
        {
            col = str_to_int(inputs[1]);
            c_row = inputs[0];
        } else
        {
            continue;
        }

        cin.ignore();
        cout << endl;

    }
    while(!(toupper(c_row) >='A' && toupper(c_row) <= 'J') ||
        !(col>=1 && col <= 10) );

    cout << "right input !!" << endl; 

    return 0;
}