[英]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 >> y
, row
包含'C'
並且y
仍包含調用該函數之前所具有的任何值 (記住y
是對該函數外部變量的引用!)這是問題所在:您檢查通過查看y
的值來查看讀取是否成功,但是即使讀取失敗,也很有可能在1到9之間(尤其是如果您在循環中調用此函數並重用相同的y
)。 所以,你的代碼認為一切正常,即使它沒有和流已經得到了它的failbit
集...這一切,如果這個點之后去有點瘋狂並不奇怪。
(2)如果行不完整,則使用cin
提取來讀取數據的方式可能會出現錯誤。 這是因為讀取整數會跳過前導空格-包括換行符。 因此,例如,如果(無效)輸入行僅是“ B”,則可以通過提取一個字符正確讀取“ B”,然后整數提取將吞下換行符並失敗(假設下一個輸入行沒有t以整數開頭)。 然后,您的忽略將完全跳過下一行(除非您由於點(1)而沒有失敗)!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.