逻辑流程不正确?获取数独游戏坐标的函数

时间:2010-04-05 16:27:50

标签: c++

我的这个功能一直在使自动编程器失败,我试图弄清楚它的逻辑流是否有问题?有什么想法吗?

基本上,如果行错误,应打印“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;
    }
}

1 个答案:

答案 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)而没有接收失败!)。