[英]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.