從文檔fgets()
:
讀取最多次數 - 來自海峽指定的文件流,並將它們存儲1個字符。生成的字符串始終以NULL結尾。如果發生文件結尾或發現換行符,則停止解析,在這種情況下,str將包含該換行符。
請求最多讀取8
個字符(這意味着要傳遞9
作爲第二個參數)。如果用戶輸入超過7
個字符,則可以捕捉它。通知用戶失敗並跳過stdin
中的任何遺留物。如果用戶正確輸入7
並且返回fgets()
將停止在換行符處。
檢查返回值fgets()
以確保代碼不會嘗試處理單位化緩衝區。
例如:
char password[9];
if (fgets(password, 9, stdin))
{
/* Strip new-line if present. */
char* nl = strchr(password, '\n');
if (nl) *nl = 0;
if (strlen(password) > 7)
{
/* Password too long.
Skip remaining input if necessary. */
int c;
while ((c = fgetc(stdin)) != EOF && c != '\n');
}
else if (0 == strcmp("letmein", password))
{
/* Good password. */
}
else
{
/* Incorrect password. */
}
}
感謝您的響應。我想說的是,如何確保用戶提供的輸入不超過8個字符(包括空終止符號?)。如果用戶輸入「letmein1234」,程序仍將接受它作爲一個很好的密碼,因爲1234被fgets截斷。我該如何解決這個問題? – Matthew
@Matthew,也許我不清楚。我的回答是建議指示'fgets()'讀取多於'7'。這意味着如果用戶輸入「letmein1234」,那麼'fgets()'會讀取''letmein1''',其餘的輸入是無關緊要的。如果用戶輸入「letmein」,那麼'fgets()'將停在新行。 – hmjd
@Matthew:使緩衝區足夠大,以保存用戶可以合理設想的最長行(例如1024字節),然後讀取它。然後檢查讀取的長度(減去換行符後)是否太長;只有檢查字符串是否相等。或者,散列用戶輸入的內容減去換行符,並將其與保存的散列進行比較;如果字符串太長,它不會哈希到正確的值,但用戶不會對您的代碼有定時攻擊。 –