簡體   English   中英

如果用戶輸入更多,如何只讀取一個字符而忽略其他字符?

[英]How can I read only one character and ignore the others if the users types more?

我有一個只能用 C 制作的項目(我不允許使用 C++)。 現在我正在處理 UI(控制台中顯示了一個小菜單,每個選項都分配了一個 0 到 6 的數字,用戶輸入數字,點擊 Enter 等等)。

我的閱讀選項功能有問題。

起初我試過

int option;
scanf("%d", &option);

但這在我輸入字符時引起了問題。

我嘗試閱讀一個字符:

char option;
scanf("%s", &option);
option -= '0'; 

這讓我可以把它當作一個數字來對待,並且在第一次測試中工作得很好,讓我可以驗證該選項是否有效(它不是一個字母,它是一個介於 0 和 6 之間的數字)。

問題是我可以輸入多個字符,並且所有字符都將存儲在內存中的某個位置。 這顯然很糟糕。

我嘗試使用"%c"閱讀,但這將顯示我輸入的字符串中每個字符的錯誤消息。

為了讓它更清楚一點,這是函數

int readOption(int maxOp)
{
    char option = -1;
    while(option < 0 || option > maxOp)
    {
        scanf("%c", &option);
        option -= '0';
        if(option < 0 || option > maxOp)
            printf("Invalid option!\nTry again: \n");
    }
    return option;
}

如果我輸入“ abc ”,錯誤信息將被打印 3 次。

那么如何確保輸入的任何額外字符都被忽略呢?

嘗試這個

int ch;
scanf(" %c", &option);
while((ch = getchar()) != '\n');

未經測試,購買您可以嘗試這樣的事情:

scanf(" %[0-6]1d*[^\n]", &option);

僅當輸入是 0 到 6 之間的單個數字時,對scanf的調用才有效,忽略前導空格。 *抑制之后不在此范圍內且不是換行符的任何字符。

您可以使用getc()來完成這樣的工作:

int main(){
    char choice = getc(stdin);
    fflush(stdin);
}

現在choice是第一個輸入的字符,刪除第一個字符后輸入的所有內容,因此不會中斷任何其他用戶輸入。

通常,當用戶輸入時,它存儲在一個名為stdin的特殊緩沖區中,如果在使用fflush(stdin)讀取第一個字符后不刪除該緩沖區,它將中斷任何未來的用戶輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM