這個功能非常簡單,至少它應該是。一些背景知識:我正在構建一個國際象棋程序,並且此函數運行時將提升值分配給已達到表末尾的棋子。這只是讀取促銷請求的功能;檢測和實際推廣是一個更高的目標。下面的代碼:由這個簡單功能的行爲困惑
char promote (int player)
{
char req, out;
req = '0'; //shouldn't be necessary, and should be overwritten by scanf
out = '0'; //just in case, should be overwritten
printf("What piece would you like to promote to? (Q/N/R/B) \n");
scanf("%c", &req);
if (req == 'q' || req == 'Q')
{
out = 'q';
}
else if (req == 'r' || req == 'R')
{
out = 'r';
}
else if (req == 'n' || req == 'N')
{
out = 'n';
}
else if (req == 'b' || req == 'B')
{
out = 'i';
}
else if (req != 'q' && req != 'Q' && req != 'r' && req != 'R' && req != 'n' && req != 'N' && req != 'b' && req != 'B')
{
printf("req: %c, out: %c \n", req, out); //to test variable values
printf("That character is invalid. Please enter another.\n");
return promote(player);
} //a simple else should suffice here. I put in the else if as a possible fix via redundancy (didn't work)
if(player == 2)
{
out = toupper(out); //designates team by case
}
printf("Returning %c\n", out); //test out value again
return out;
}
會發生什麼:FXN掃描單個字符輸入,賦予它REQ,檢查REQ對八種可能的選擇。如果它適合四個箱子中的一個,它將分配四個值中的一個值;如果沒有,它會打印一個簡單的錯誤消息並返回自己的呼叫,此時它會掃描等。
發生了什麼:調用時,scanf讀取一個\ n(自動),並立即返回錯誤消息並循環而不等待輸入。在第二個循環中,它可以正常工作,但有一點需要注意:當我輸入無效字符時,它會返回正確的錯誤消息,並且在再次調用自身時,會在再次工作之前經過一次讀取\ n的循環。建議函數本身,而不是錯誤消息,是責任。
輸出:
You can now promote your pawn. What piece would you like to promote to? (Q/N/R/B)
req:
, out: 0
That character is invalid. Please enter another.
What piece would you like to promote to? (Q/N/R/B)
q
Returning q
任何想法?我嘗試了十幾件不同的事情來解決這個問題,而且他們都沒有工作。可能非常簡單,就像我所有的重大錯誤一樣。謝謝你的幫助!
是的,工作,雖然我不知道什麼輸入混合起來。這是一個常見問題嗎?並且很好的接觸tolower,甚至不想用它來簡化我的測試! – Dasbooten
@Dasbooten:可能是以前的輸入,但由於您沒有顯示整個控制檯日誌,因此無法確定哪個輸入。 – nneonneo
以前只有一個輸入:scanf(「%s%s%s」,move.loc1,move.to,move.loc2);後面跟着一個printf(「\ n」),所以它就是那個。有沒有修復? – Dasbooten