密码验证 Else 语句在不应该触发时触发
Password Validation Else Statement Firing When It Shouldn't
我正在尝试在 C 中验证密码,并且我的 else
语句之一会在代码 运行s 时自动触发。我 运行 测试一个字符是否是一个符号,如果它是使用 symbol++;
向 int symbol
加 1,但问题是无论字符是否我正在测试是一个符号。
我认为这个问题与我的 if, else
语句的结构有关,我已经尝试了几种组合,但是有些错误导致程序中断我使用了 else if
但这没有帮助。这看起来应该很明显,但我似乎无法弄清楚哪里出了问题。
char password[30];
int lower, upper, number, symbol, i;
lower = upper = number = symbol = 0;
printf("Enter your password: ");
scanf("%s", &password);
int len = strlen(password);
for (i = 0; i <= len; i++) {
if (isalpha(password[i])){
if (isupper(password[i])){
upper++;
}
else{
lower++;
}
}
if (isdigit(password[i])){
number++;
}
else{
symbol++;
}
}
if (upper >= 1 && lower >= 1 && number >= 1 && symbol >= 1 && len >=6){
printf("Your password is good!");
}
if (upper < 1){
printf("You need an uppercase letter \n");
}
if (lower < 1){
printf("You need a lowercase letter \n");
}
if (number < 1){
printf("You need a number \n");
}
if (symbol < 1){
printf("You need a symbol \n");
}
if (len < 6){
printf("Your password must be at least 6 characters \n");
}
在您的代码中,更改
for (i = 0; i <= len; i++)
至
for (i = 0; i < len; i++)
as,C
数组具有基于 0
的索引。否则,您 可能会 超出分配的内存,这反过来会调用 undefined behaviour.
注意:即使你没有溢出内存(因为你有一个编译时分配的数组并且输入可能小于实际数组大小),你也会结束比较终止 nul
,这可能是您不想要的。
然后,isdigit()
检查不应该是 standalone if
(按照你的逻辑),它应该是 else if
with isalpha()
.
也就是说,
scanf("%s", &password);
应该是
scanf("%29s", &password);
以避免任何可能的缓冲区溢出风险。
行
symbol++;
将在输入字母时执行。
为防止出现这种情况,请在 isdigit
测试之前插入 else
。
else if (isdigit(password[i])) {
正如其他人指出的那样,循环也不正确。应该是
for (i = 0; i < len; i++) {
您的代码如下所示:
if (cond1){}
if (cond2){}
else {}
在这种情况下,else
块的执行独立于 cond1
块,如 C11 标准草案第 6.8.4.1 节 $3 所述:An else is associated with the lexically nearest preceding if that is allowed by the syntax.
您可以将代码结构更改为:
if (cond1){}
else if (cond2){}
else {}
我正在尝试在 C 中验证密码,并且我的 else
语句之一会在代码 运行s 时自动触发。我 运行 测试一个字符是否是一个符号,如果它是使用 symbol++;
向 int symbol
加 1,但问题是无论字符是否我正在测试是一个符号。
我认为这个问题与我的 if, else
语句的结构有关,我已经尝试了几种组合,但是有些错误导致程序中断我使用了 else if
但这没有帮助。这看起来应该很明显,但我似乎无法弄清楚哪里出了问题。
char password[30];
int lower, upper, number, symbol, i;
lower = upper = number = symbol = 0;
printf("Enter your password: ");
scanf("%s", &password);
int len = strlen(password);
for (i = 0; i <= len; i++) {
if (isalpha(password[i])){
if (isupper(password[i])){
upper++;
}
else{
lower++;
}
}
if (isdigit(password[i])){
number++;
}
else{
symbol++;
}
}
if (upper >= 1 && lower >= 1 && number >= 1 && symbol >= 1 && len >=6){
printf("Your password is good!");
}
if (upper < 1){
printf("You need an uppercase letter \n");
}
if (lower < 1){
printf("You need a lowercase letter \n");
}
if (number < 1){
printf("You need a number \n");
}
if (symbol < 1){
printf("You need a symbol \n");
}
if (len < 6){
printf("Your password must be at least 6 characters \n");
}
在您的代码中,更改
for (i = 0; i <= len; i++)
至
for (i = 0; i < len; i++)
as,C
数组具有基于 0
的索引。否则,您 可能会 超出分配的内存,这反过来会调用 undefined behaviour.
注意:即使你没有溢出内存(因为你有一个编译时分配的数组并且输入可能小于实际数组大小),你也会结束比较终止 nul
,这可能是您不想要的。
然后,isdigit()
检查不应该是 standalone if
(按照你的逻辑),它应该是 else if
with isalpha()
.
也就是说,
scanf("%s", &password);
应该是
scanf("%29s", &password);
以避免任何可能的缓冲区溢出风险。
行
symbol++;
将在输入字母时执行。
为防止出现这种情况,请在 isdigit
测试之前插入 else
。
else if (isdigit(password[i])) {
正如其他人指出的那样,循环也不正确。应该是
for (i = 0; i < len; i++) {
您的代码如下所示:
if (cond1){}
if (cond2){}
else {}
在这种情况下,else
块的执行独立于 cond1
块,如 C11 标准草案第 6.8.4.1 节 $3 所述:An else is associated with the lexically nearest preceding if that is allowed by the syntax.
您可以将代码结构更改为:
if (cond1){}
else if (cond2){}
else {}