我的任务是创建一个密码判断程序,它将确定我输入的密码是否强大。我无法弄清楚如何将标准设置为真。
以下是标准。
它应该至少有八(8)个字符。 它应该至少有一(1)位数字。 它应该至少有一(1)个小写字母。 它应该至少有一(1)个大写字母。
这是我到目前为止所做的。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define T 100
#define MAX 255
int main(){
char string[T][MAX];
int t;
int i, j;
int crit1[T], crit2[T], crit3[T], crit4[T];
scanf("%d", &t);
getchar();
for (i=0; i<t; i++){
fgets(string[i], sizeof(string[i]), stdin);
if(strlen(string[i])>=8)
crit1[i]=1;
}
for (i=0; i<t; i++){
for(j=0; j<strlen(string[i]); j++){
if(!isdigit(string[i][j])){
crit2[i]=1;
}
if(!islower(string[i][j])){
crit3[i]=1;
}
if(!isupper(string[i][j])){
crit4[i]=1;
}
}
}
for (i=0; i<t; i++){
if (crit1[i]==1 && crit2[i]==1 && crit3[i]==1 && crit4[i]==1)
printf("Case #%d: STRONG\n", i+1);
else
printf("Case #%d: NOT STRONG\n", i+1);
}
return 0;
}
如果我输入第一种情况的“password123”和第二种情况的“Password123”。当两个案例只能识别第二个案例STRONG并且第一个案例应该输出NOT STRONG时,程序将输出STRONG。
答案 0 :(得分:3)
有几件事。
首先,声明一个能说明密码是否强大的函数。你应该能够将一个字符串传递给函数,它将返回一个答案 告诉你密码是否很强。
然后你可以在条件更详细的情况下查看更少的干扰,比如那些在旧代码中没有充分理由的所有内容中的额外循环变量i
。
您的情况问题变得非常简单:它们都是“倒置的”。也就是说,当您看到一个数字时,不会检查标准crit2
,但您执行检查crit3
和{{ 1}}。
所以现在如果你看到一个小写或大写字母,你会
勾选crit4
(并冗余地检查另一个标准)
你会在最后说“强”。
所以给你的变量名称说明他们做了什么。
从不crit2
,crit1
等。也许是crit2
,is_long_enough
等。当你写has_digit
时,至少你有一个直接的线索,你应该看一个数字。
那么当is_digit = 1
为真时,你就不太可能犯下愚蠢的错误,就像设置这个标准一样,因为这与
你试图满足的条件。
在这里你也有一些未初始化的数组,正如其他人所观察到的那样,但如果你接受建议写一个函数来判断一个密码是否很强,并为每个密码调用一次该函数,那么你的四个数组就会消失从代码。它们被函数内部的四个变量所取代,只需要指示一个密码的强度(此时函数正在处理的密码)。请记住,当你声明它时,每个变量都会获得一个初始化器,为每个变量选择一个明显的初始化器,你就可以了。
答案 1 :(得分:1)
正如许多其他人所说,你有一个明确的未初始化数组问题,但是在初始化的内存中你很难找到&#34;那些&#34;。错误结果的实际来源是您不应该否定您的条件,例如:!islower(string[i][j])
应该只是islower(string[i][j])
答案 2 :(得分:0)
你必须初始化crit1 [],crit2 []等。到0。
for (i=0; i<T; i++)
crit1[i] = crit2[i] = crit3[i] = crit4[i] = 0