2012-10-04 40 views
0

我已經用C編寫了一個程序,讓用戶輸入密碼讓他進入系統。我正在使用fgets方法。正確的密碼是「letmein」。這是代碼:C - fgets和stdin的長度

現在我想驗證用戶通過stdin輸入的密碼不超過8個字符。由於程序是(沒有空if語句),即使用戶輸入「letmein0000000」,用戶也被授予訪問權限,因爲只有前七個字符被fgets提取。現在我只想授予用戶訪問權限,如果他輸入「letmein」。這怎麼能做到呢?

P.S.我必須使用fgets,因爲它是我的項目中的一項要求。

回答

6

從文檔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. */ 
    } 
} 
+0

感謝您的響應。我想說的是,如何確保用戶提供的輸入不超過8個字符(包括空終止符號?)。如果用戶輸入「letmein1234」,程序仍將接受它作爲一個很好的密碼,因爲1234被fgets截斷。我該如何解決這個問題? – Matthew

+0

@Matthew,也許我不清楚。我的回答是建議指示'fgets()'讀取多於'7'。這意味着如果用戶輸入「letmein1234」,那麼'fgets()'會讀取''letmein1''',其餘的輸入是無關緊要的。如果用戶輸入「letmein」,那麼'fgets()'將停在新行。 – hmjd

+0

@Matthew:使緩衝區足夠大,以保存用戶可以合理設想的最長行(例如1024字節),然後讀取它。然後檢查讀取的長度(減去換行符後)是否太長;只有檢查字符串是否相等。或者,散列用戶輸入的內容減去換行符,並將其與保存的散列進行比較;如果字符串太長,它不會哈希到正確的值,但用戶不會對您的代碼有定時攻擊。 –