这是我的代码:
#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)。如果用户输入了错误的输入,程序将再次询问,直到用户输入正确的输入。
当无效输入为“ z11”,“ A0”,“ 31241”时有效。
但是当无效输入为“ 8z”,“ uu”,“ abcde”时,它将导致无限循环。
我该如何解决这个问题,为什么会发生?
答案 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];
然后使用char
和isalpha(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_row
和col
分配值。但是输入数组是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;
}