[英]True or false condition in C programming
我的任务是创建一个密码判断程序,该程序将确定我输入的密码是否强。 我不知道如何将标准设置为true。
这是标准。
它应至少包含八(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。
几件事。
首先,声明一个函数,说明密码是否强。 您应该能够将字符串传递到函数中,并且它将返回一个答案,告诉您密码是否强壮。
然后,您可以在分散注意力较少的情况下详细查看条件,例如多余的循环变量i
毫无用处地出现在所有旧代码中。
您的条件存在的问题非常简单:它们都是“倒置的”。 也就是说,当您看到一个数字时,您不会检查标准crit2
,但是会检查crit3
和crit4
。 因此,现在如果您看到小写或大写字母,您将选中crit2
(并多余地检查另一个条件),最后将说“ strong”。
因此,给您的变量名称说明它们的作用。 永远不要crit1
, crit2
等。 也许是is_long_enough
, has_digit
等。这样,当您编写is_digit = 1
,至少可以立即得到一个提示,您应该查看一个数字。 然后,您不太可能犯傻的错误,例如当!isdigit(c)
为true时将此标准设置为true,因为这与您要满足的条件完全相反。
正如其他人所观察到的,这里也有一些未初始化的数组,但是如果您建议编写一个函数来判断单个密码是否强壮,并为每个密码调用一次该函数,那么您的四个数组就会从代码中消失。 它们由函数内的四个变量代替,这些变量仅需指示一个密码的强度(该函数当前正在使用该密码)。 只要记住,每个变量在声明它时都会得到一个初始化器,为每个变量选择明显的初始化器,一切都会好起来的。
正如许多其他人所述,您显然有一个未初始化的数组问题,但是在该已初始化的内存中找到“ 1”的可能性很小。 错误结果的实际来源是您不应该否定条件,例如: !islower(string[i][j])
应该只是islower(string[i][j])
您将必须初始化crit1 [],crit2 []等。 到0。
for (i=0; i<T; i++)
crit1[i] = crit2[i] = crit3[i] = crit4[i] = 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.