2015-06-11 79 views
1

當我在我下面的程序,並按下輸入密碼進入我得到一個調試 斷言錯誤,特別是isctype.c線失敗的錯誤56爲什麼我會得到一個調試斷言上運行的代碼

表達:(無符號)(c + 1)< = 256

有人可以幫我解決這個問題嗎?

代碼:

int main() 
{ 
     int j=0; 
     char pass[100]; 
     int upper=0, lower=0, digit=0, sc=0; 

     printf("Enter your password:\n"); 
     scanf("%s",&pass); 

     while(j!=' '){ 
       if(isalpha(pass[j])){ 
         if(isupper(pass[j])){ 
           upper++; 
         } 
         else{ 
           lower++; 
         } 
       } 
       else if(isdigit(pass[j])){ 
         digit++; 
       } 
       else{ 
         sc++; 
       } 
       j++; 
     } 

     if(upper==0||lower==0||digit==0||sc==0){ 
       printf("Password must contain atleast one upper case, one lower case, one digit and a special character"); 
     } 
     else{ 
       printf("Good to go"); 
     } 
     return 0; 
     _getch(); 
} 
+3

請做我們(和你自己)的忙,並縮進你的代碼。 –

+2

'while(j!='')'??? –

+0

好的,那麼如果你沒有在密碼中輸入任何空格......循環將永遠存在(甚至可能在你的數組之外)?順便說一句,_getch()**之後**返回? –

回答

0

更換

while (j!=' ') 

通過

while (pass[j] != 0) 

要循環,只要pass[j]異於零。請記住,字符串以零結尾。

0

它看起來像你的代碼的問題是

while(j!=' ') 

這是檢查j針對該具有32(十進制)ASCII value空間(' ')。

本質上,你是無條件使用具有索引0pass數組元素〜31

然後,pass是一個自動局部變量和你沒有進行初始化。它包含不確定的值。

如果您輸入少於31個字符的pass剩餘的元件將保持未初始化,並進一步使用它們(作爲參數is....()家庭,在這裏)可能會導致undefined behaviour

解決方案:您不需要檢查空間,(因爲%s不接受一個)。相反,你應該檢查空終止符\0。將代碼更改爲

  1. scanf("%s",&pass);scanf("%99s",pass);以避免可能的緩衝區溢出。
  2. while(j!=' ')while(pass[j])循環直到字符串終止符爲空。

這就是說,

  • 使用_getch()後無條件return聲明沒有任何意義。你可以直接刪除那個_getch()
  • 推薦的簽名main()int main(void)
相關問題