2017-01-06 32 views
0

好的,我一直在觀看Bucky Robert關於C編程的教程,他給觀衆的第一個任務是製作一個程序來檢查密碼是否至少有一個大寫字母,一個數字和一個美元符號。

這是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 

int main() 
{ 
    int upper = 0; 
    int digit = 0; 
    int dollar = 0; 

    char password[16]; 

    int loop = 1; 

    while(loop == 1){ 

     printf("Enter your password: "); 
     scanf(" %s", password); 

     int i; 
     for(i = 0; i <= 16; i++){ 
      printf(" %c", password[i]); 

      if(isupper(password[i])){ 
       upper = 1; 
       printf("\t is upper"); 
      } 

      if(isdigit(password[i])){ 
       digit = 1; 
       printf("\t is digit"); 
      } 

      if(password[i] == '$'){ 
       dollar = 1; 
       printf("\t is dollar"); 
      } 
      printf("\n"); 
     } 

     if((upper == 1) && (digit == 1) && (dollar == 1)){ 
      printf("Your password is valid\n"); 
      loop = 0; 
     } else { 
      printf("Your password is invalid\n"); 
     } 
    } 

    return 0; 
} 

該程序打印此控制檯「P4sswoRd」的輸入後:

Enter your password: P4sswoRd 
P  is upper 
4  is digit 
s 
s 
w 
o 
R  is upper 
d 

╨ 

@ 

ö 
  
` 
$  is dollar 
Your password is valid 

我輸入的密碼都不包含「$」字符但該程序仍然找到一種方法來檢測它。在角色檢查代碼中出現錯誤並查看密碼全部有效的原因之後,它打印「數字」或「是美元」的原因。我不知道爲什麼所有這些隨機字符都打印出來,我寧願知道我的程序出了什麼問題,而不願意採用新的方法來完成手頭的任務。

+0

好了,所以我固定的代碼的一部分(謝謝你的方式),但只是部分固定它。只要有大寫字母和數字,它並不總是有效的。如果密碼是1A,那麼它是有效的,1a是無效的。奇怪字符的隨機列表仍然存在,所以也許它與變量i及其在檢測for循環中的'$'字符中的用途有關。 –

+0

看看[this](https://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm)頁面:你應該使用scanf的返回值。 –

回答

3

這個循環是錯誤的:

for(i = 0; i <= 16; i++){ 

如果你只輸入4個字符,你應該只檢查字符串的前4個字符。這就是爲什麼你會看到很多隨機字符 - 這些是在password的其餘元素中的垃圾。它應該是:

size_t pw_len = strlen(password); 
for (i = 0; i < pw_len; i++) { 

另外,請記住,由於數組是從零開始的,因此數組的最後一個元素的索引長度爲1。因此,如果您確實想要處理聲明爲password[16]的數組中的所有元素,則循環條件應爲i < 16,而不是i <= 16--它將嘗試在最後一次迭代時訪問數組外部。

您還需要初始化while循環開始處的upper,digitdollar變量。否則,如果您輸入帶有數字和$的密碼,則使用鞋幫的新密碼,第二個密碼將被稱爲有效,因爲它仍然具有前一密碼的digitdollar設置。

所以它應該是:

while(loop == 1){ 
    upper = digit = dollar = 0; 
+0

感謝幫助,隨機字符不再顯示。現在的問題是,它打印有效的情況下,只有'$'字符和數字而不是'$'字符,數字和大寫字符。 –

+0

您需要每次通過'while'循環重置'upper','digit'和'dollar'變量。 – Barmar

+0

非常感謝!該計劃現在已經修復,我非常感謝Barmar的幫助。 –

相關問題