程序退出我用C寫的下面的程序:Ç - 當輸入超過與fgets津貼
與該程序的主要問題是,如果輸入使用時與fgets()函數,程序公正出口超過80個字符立即。其他代碼被執行,但不等待用戶按Enter鍵。它就像簡單地忽略了最後的getchar。
請問我該如何解決這個問題?
程序退出我用C寫的下面的程序:Ç - 當輸入超過與fgets津貼
與該程序的主要問題是,如果輸入使用時與fgets()函數,程序公正出口超過80個字符立即。其他代碼被執行,但不等待用戶按Enter鍵。它就像簡單地忽略了最後的getchar。
請問我該如何解決這個問題?
如果用戶輸入的長度大於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?
}
}
檢查換行符被fgets()
閱讀,直到遇到一個換行符如果不跳過輸入:
if (0 == strrchr(password, '\n'))
{
/* Skip until new-line. */
int c;
while (EOF != (c = getchar()) && '\n' != c);
}
否則,致電getchar()
將讀取什麼fgets()
沒有。
您可能需要重新考慮換行符的自動刪除(除了您提到的問題,以下簡單回答)。如果輸入超過80個字符,則緩衝區中不會有新行,並且您正在覆蓋用戶數據。不是一個嚴重的錯誤,只是在這種情況下,會丟失密碼內容。 – WhozCraig