2014-03-24 19 views
0

這個功能非常簡單,至少它應該是。一些背景知識:我正在構建一個國際象棋程序,並且此函數運行時將提升值分配給已達到表末尾的棋子。這只是讀取促銷請求的功能;檢測和實際推廣是一個更高的目標。下面的代碼:由這個簡單功能的行爲困惑

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 

任何想法?我嘗試了十幾件不同的事情來解決這個問題,而且他們都沒有工作。可能非常簡單,就像我所有的重大錯誤一樣。謝謝你的幫助!

回答

0

看起來像scanf正在讀取換行符,可能來自之前的輸入。爲了解決這個問題,你可以簡單地循環scanf,直到你得到的東西是不是空白:

do { 
    scanf("%c", &req); 
} while(isspace(req)); 

順便說一句,你可以使用tolower一個字符轉換爲小寫,這應該簡化req測試。

+0

是的,工作,雖然我不知道什麼輸入混合起來。這是一個常見問題嗎?並且很好的接觸tolower,甚至不想用它來簡化我的測試! – Dasbooten

+0

@Dasbooten:可能是以前的輸入,但由於您沒有顯示整個控制檯日誌,因此無法確定哪個輸入。 – nneonneo

+0

以前只有一個輸入:scanf(「%s%s%s」,move.loc1,move.to,move.loc2);後面跟着一個printf(「\ n」),所以它就是那個。有沒有修復? – Dasbooten