繁体   English   中英

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

[英]Incorrect logic flow? function that gets coordinates for a sudoku game

我的此功能使自动分级机不断失败,我试图找出其逻辑流程是否存在问题? 有什么想法吗?

基本上,如果该行错误,则应打印“ invalid row”,然后执行clearInput();。 调用,并返回false。 如果y错误,则打印“无效列”,然后clearInput(); 调用并返回false。

如果两者都不正确,则仅打印“无效行”(并且仍然clearInput并返回false。

显然,当row和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)通过检查y的值来检测列读取失败的方式-但是您确定调用代码将其设置为1-9范围之外的值吗? 否则,即使读取失败,您也可能认为读取成功。 您可以通过添加y=0;来解决此问题y=0; 到函数的开头

一些更多的解释:当您使用cin >> y将一个整数读入y没有一个整数要读时(可能是因为流中有一个非数字,或者达到了EOF,或其他) y不会被感动。 因此,假设您的输入看起来像“ CB”。 然后,在cin >> row >> yrow包含'C'并且y仍包含调用该函数之前所具有的任何值 (记住y是对该函数外部变量的引用!)这是问题所在:您检查通过查看y的值来查看读取是否成功,但是即使读取失败,也很有可能在1到9之间(尤其是如果您在循环中调用此函数并重用相同的y )。 所以,你的代码认为一切正常,即使它没有和流已经得到了它的failbit集...这一切,如果这个点之后去有点疯狂并不奇怪。

(2)如果行不完整,则使用cin提取来读取数据的方式可能会出现错误。 这是因为读取整数会跳过前导空格-包括换行符。 因此,例如,如果(无效)输入行仅是“ B”,则可以通过提取一个字符正确读取“ B”,然后整数提取将吞下换行符并失败(假设下一个输入行没有t以整数开头)。 然后,您的忽略将完全跳过下一行(除非您由于点(1)而没有失败)!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM