我的这个功能一直在使自动编程器失败,我试图弄清楚它的逻辑流是否有问题?有什么想法吗?
基本上,如果行错误,应打印“invalid row”,并且clearInput();叫,并返回false。当y错误时,打印“invalid column”,并且clearInput();叫做并返回false。
当两者都错误时,只打印“无效行”(仍然是clearInput并返回false。
显然,当行和y正确时,不打印错误并返回true。
我的功能通过大多数测试用例,但最终失败了,我为什么会有点迷失。
bool getCoords(int & x, int & y)
{
char row;
bool noError=true;
cin>>row>>y;
row=toupper(row);
if(row>='A' && row<='I' && isalpha(row) && y>=1 && y<=9)
{
x=row-'A';
y=y-1;
return true;
}
else if(!(row>='A' && row<='I'))
{
cout<<"Invalid row"<<endl;
noError=false;
clearInput();
return false;
}
else
{
if(noError)
{
cout<<"Invalid column"<<endl;
}
clearInput();
return false;
}
}
答案 0 :(得分:0)
如果没有看到输入,很难知道,但这里有几个可能的问题:
(1)您检测到列读取失败的方法是检查y
的值 - 但是您确定调用代码将其设置为范围1-9
之外的值吗?否则,即使读取失败,您也可能认为成功。您可以通过在函数的开头添加y=0;
来解决此问题。
更多解释:当您使用cin >> y
将整数读入y
但不是要读取的整数时(可能是因为存在非数字)在流中,或达到EOF,或任何其他方式)y
的值不会被触及。所以,想象你的输入看起来像“CB”。在您cin >> row >> y
之后,row
包含'C'
且y
仍然包含在调用函数之前具有的任何值(请记住y
这是对这个函数之外的变量的引用!)这就是问题所在:你通过查看y
的值来检查读取是否成功,但是它很可能在1到9之间,即使读取失败(特别是如果您在循环中调用此函数并重用相同的y
)。所以你的代码认为一切都没问题,即使它没有,并且流现在已经设置了failbit
......如果在此之后一切都变得有点疯狂,那就不足为奇了。
(2)如果某行不完整,您使用cin
提取读取数据的方式可能会出错。那是因为读取整数将跳过前导空格 - 包括换行符。因此,如果(无效)输入行只是“B”,例如,您通过提取字符串正确读取“B”,然后整数提取将吞下换行符并失败(假设下一个输入行没有' t以整数开头)。然后你的忽略将完全跳过下一行(除非你因为点(1)而没有接收失败!)。