2012-11-23 61 views
1

程序退出我用C寫的下面的程序:Ç - 當輸入超過與fgets津貼

與該程序的主要問題是,如果輸入使用時與fgets()函數,程序公正出口超過80個字符立即。其他代碼被執行,但不等待用戶按Enter鍵。它就像簡單地忽略了最後的getchar。

請問我該如何解決這個問題?

+0

您可能需要重新考慮換行符的自動刪除(除了您提到的問題,以下簡單回答)。如果輸入超過80個字符,則緩衝區中不會有新行,並且您正在覆蓋用戶數據。不是一個嚴重的錯誤,只是在這種情況下,會丟失密碼內容。 – WhozCraig

回答

2

如果用戶輸入的長度大於fgets可能從stdin中讀取的79個字符(它最多可以讀取一個小於其大小參數所說的字符,因爲它將0-終止緩衝區),剩餘的輸入保留在輸入緩衝區,因此最後getchar()立即成功。

爲了避免這種情況,如果輸入過長,您需要清除輸入緩衝區。

問題是,如果輸入足夠短,您不知道是否清除緩衝區。所以,檢查你是否實際上得到一個換行符通過fgets閱讀,

int len = strlen(password); 
if (password[len-1] == '\n') { 
    // got a newline, all input read, overwrite newline 
    password[len-1] = 0; 
} else { 
    // no newline, input too long, clear buffer 
    int ch; 
    while ((ch = getchar()) != EOF && ch != '\n'); 
    if (ch == EOF) { 
     // input error, stdin closed or corrupted, what now? 
    } 
} 
+0

請問這怎麼辦? – Matthew

+0

剛剛更新了一種方式來做到這一點;) –

+0

非常感謝你:)這解決了我的問題elegrantly :) – Matthew

1

檢查換行符被fgets()閱讀,直到遇到一個換行符如果不跳過輸入:

if (0 == strrchr(password, '\n')) 
{ 
    /* Skip until new-line. */ 
    int c; 
    while (EOF != (c = getchar()) && '\n' != c); 
} 

否則,致電getchar()將讀取什麼fgets()沒有。