2014-09-23 141 views
0

所以,我正在開發一個簡單的密碼程序。我有了這個代碼,到目前爲止如何限制輸入的字符數

/* simple password prog */ 
#include<stdio.h> 
#include<string.h> 
int main(){ 
     char usrIn[9]; 
     char password[]={"AXcd8002"}; 
     do { 

     fprintf(stdout,"\n Password:"); 
     fgets(usrIn,9, stdin); 
     if (strcmp(usrIn,password)<0 || strcmp(usrIn,password)>0) { 
     fprintf(stdout,"\n Password incorrect"); }; 

     }while((strcmp(password,usrIn))!=0); 

fprintf(stdout, "\n The password is correct \n"); 
return 0; 
} 

此代碼工作正常,如果密碼不正確,則循環繼續下去,如果這是正確的 - 循環將打破。但是不起作用的是:如果用戶至少輸入一個字符的密碼,程序仍然會說它是正確的。例如,如果用戶輸入AXcd8002AAA,則fgets將只讀取AXcd8002,並忽略AAA。我怎樣才能防止這種情況發生?

+3

使緩衝區大於密碼,是不是很簡單?而且strcmp對於密碼也是不安全的,因爲它會花費不同的時間來寫錯誤和寫密碼,所以如果你測量時間,你可以確定寫入和錯誤的字符序列。 – 2014-09-23 05:17:01

+0

謝謝,伊萬。這僅僅是課堂作業,我們現在正在翻閱字符串,所以這就是爲什麼它很簡單。所以我做了char usrIn [10]和fgets(usrIn,10,stdin),即使我輸入正確的字符串,它也會抱怨密碼不正確 – 2014-09-23 05:26:32

+0

fgets讀取所有字符,包括'\ n'(當您單擊Enter時)。因此,首先在'\ n'出現之前檢查長度。如果長度很好,用0代替\ n並比較字符串(buffer [9] ='\ 0')。 – 2014-09-23 05:48:48

回答

3

usrIn只有9個字符,當然多餘的字符被忽略。只要給usrIn足夠的空間:

char usrIn[100]; 

而作爲一個最佳實踐:

fgets(usrIn, sizeof(usrIn), stdin); 

有,你沒有考慮另一個問題:換行字符'\n'被認爲是一種有效的字符由fgets,所以它也在usrIn,你需要在比較密碼之前手動刪除它。

+0

我提出了調整建議,替代char usrIn [100];和fgets(usrIn,sizeof(usrIn),stdin);但現在它抱怨密碼不正確,即使我輸入了正確的密碼 – 2014-09-23 05:28:45

+0

@謝爾奇請參閱編輯。 – 2014-09-23 05:34:32

+0

我已將\ n添加到密碼中,如char password [] = {「AXcd8002 \ n」};這解決了這個問題,但可能不是最佳實踐,對吧?你提到我需要將它從fgets中刪除,那怎麼能實現? – 2014-09-23 05:38:12

0

不給usr的大小給它動態大小&執行動態輸入會將完整的密碼插入到數組usrIn中。

+0

所以我留下了char usrIn [];像這樣,但是現在gcc編譯器給了我這個:「password2.c:在函數'main'中: password2.c:5:7:error:array size in'usrIn' char usrIn []; ^ 」 – 2014-09-23 05:30:15