簡體   English   中英

在不使用strcmp(C)的情況下檢查密碼

[英]Check password without the use of strcmp (C)

重點是編寫一個程序,使用戶無需使用strcmp即可輸入密碼並進行檢查。 我實際上設法使用另一種方法來完成此操作,但是我想知道為什么我在這里給出的方法不起作用。

int main()
{
    char pass[7] = { "alpine" };
    char str[20];
    int i;
    printf("Enter the password (6 letters).\n");
    gets(str);
    for (i = 0; i <= 7; i++) if (pass[i] != str[i]) {
        printf("Access denied.\n");
        goto label;
    }
    else
        break;
        printf("Acess granted.\n");
        printf("Code:1234\n");
    label: return 0;
} 

ps。 我知道它的可怕,很可能無需使用goto就可以重寫

因為這具有未定義的行為,所以無法訪問數組索引。 數組索引從0開始。 在這里,您無法訪問7元素數組的第7個索引。

嚴格禁止使用gets甚至標記為已棄用。 編譯器抱怨,您忽略了它。

初始化也會是(這里也是我使用您的版本時,編譯器拋出錯誤)

char pass[7] = "alpine" ;// char pass[]="alpine"; 

您可以使用fgets從用戶那里獲取輸入,還有一個名為strcmp的函數可以使我們輕松比較字符串。 而不是循環,使用它。

if(fgets(str,20,stdin)!=NULL){
   str[strcspn(str,"\n")]=0;
   if(strcmp(str,pass)==0){
      // they matched.
   }
}

您可以使用格式來清楚地解釋您的程序。 使您免受許多不必要的問題的困擾。 (不使用strcmp )。

#define LEN 7
...
for (i = 0; i < LEN; i++) 
   if (pass[i] != str[i]) {
        printf("Access denied.\n");
        goto label;
   } // no else needed
..

想想您先前寫的內容-如果出現不匹配,則顯示“訪問被拒絕”,但是當匹配一個字符時,您使用break並顯示“訪問被授予”-這不是它應該如何工作的。 您應該遍歷密碼中可用的所有字符。

但是,您再次錯過了一件事-假設密碼是"alpine"而您輸入的是“ alpinesssss”,您是否想授予他/她訪問權限? 否。但是您的程序給出了-這里的解決方案是什么? 首先,每當您獲得輸入密碼時-檢查它們的長度是否匹配-如果不一致,然后立即拒絕它們。

事實證明,您需要使用strlen函數-但是如果您不願意使用它,可以自己編寫函數。 (同樣,您也可以編寫strcmp )。

size_t my_strlen(const char *s){
   size_t len = 0;
   while(*s++) len++;
   return len;
}

啟用所有警告的情況下編譯代碼gcc -Wall -Werror progname.c

減1

以下循環迭代8次。 一種通過的數組大小

// Iterates too often
for (i = 0; i <= 7; i++) if (pass[i] != str[i]) {
  ...

相反,1)不要迭代字符串的末尾,2)數組的結尾pass[], str[]

出於安全原因,代碼也可以從內存中清除密碼。 使char str[20]; volatile還可以確保未優化清理代碼。

bool match = true;
for (i = 0; i < sizeof str && pass[i]; i++) {
  if (pass[i] != str[i]) {
    match = false;
    break;
  }
} 
for (i = 0; i < sizeof str; i++) {  //  clear all of str[]
  str[i] = 0;
}
for (i = 0; i < sizeof pass; i++) {  //  clear all of pass[]
  pass[i] = 0;
}
if (match) {
  puts("Access granted.");
  puts("Code:1234");
} else {
  puts("Access denied.");
}
int main(void) {
       char a[10];
       scanf("%s",a);
       char b[]="password";
       int i=0;
       if(strlen(a)==strlen(b)){
            for( i=0;i<8;){
                if(a[i]==b[i])
                    i++;
                else
                    break;
            }
            if(i<8)
                 printf("no access");
            else
                 printf("yes");
      }
      else
          printf("No access");
      return 0;
 }

輸入的密碼不應大於或小於原始密碼的大小。 因此,首先檢查該條件,然后檢查兩個字符串的長度是否相同,單詞是否匹配

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM