2015-11-19 40 views
1

這個問題很基本,但我找不到答案,所以我決定在這裏提問。如何忽略輸入緩衝區中的一個換行符,並讓scanf返回一個值?

基本上我有下面的代碼....

while (scanf(" %*[^\n]%d%c", &a, &c) != 2 || c != '\n' || a > max || a < min) { 
    printf("Error! Try again."); 
} 

...和我嘗試用它做的是確保,如果他們輸入了不正確的值,用戶得到的錯誤消息,隨後出現一個新的scanf提示符。我在大部分時間裏都有這個循環的工作,但是如果我按下回車而沒有任何其他輸入(只在輸入緩衝區中保留'\ n'),scanf只是等待更多的輸入而不是終止和返回一個值。雖然我明白這是正常的,如果scanf不符合任何條件讓它返回給調用者,我一直很難迫使它終止在其緩衝區中的單個換行符。在這裏我假定在第一個格式說明符之前留出一個空格會有幫助(這樣可以忽略單個換行符),但無論出於何種原因,它似乎都沒有幫助。有人知道我可以如何解決這個問題,同時保持現有代碼相同(如果可能的話)?

+0

據_possible_與'scanf函數解決這個()'和更多的代碼,但不值得。作爲第一步,使用'fgets()'](http://stackoverflow.com/a/33811420/2410359)或者'getline()'如果在* nix上。然後'strtol()'或者'sscanf()'等等。例子:http://stackoverflow.com/a/22544609/2410359 – chux

回答

2

你必須改變處理你的問題的策略。

  1. 使用fgets閱讀一行文字。
  2. 使用sscanf從行中提取數據。如果該行沒有數據,請重複。
char line[LINE_SIZE]; 
while (fgets(line, LINE_SIZE, stdin)) 
{ 
    if (sscanf(line, "%d", &a) != 1 || a > max || a < min) 
    { 
     printf("Error! Try again."); 
    } 
    else 
    { 
     break; 
    } 
} 

如果要執行只有一個數字,後接換行,你可以使用:

if (sscanf(line, "%d%c", &a, &c) != 2 || c != '\n' || a > max || a < min) 
相關問題