为了使自己熟悉基础知识,我一直在尝试编写一个用于选择密码的简单程序。密码应符合列出的5个条件。该代码旨在遍历密码以确定是否满足条件并提示用户任何问题。
如果满足条件,则其一致变量设置为1。任何保留为0的变量都将提示输入无效的密码。不幸的是,似乎只有第一个字符被识别。除第一个字符外,所有其他条件都将失败,无论字符串如何。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int main(void) {
char password[21];
int loop;
int dollar = 0;
int digit = 0;
int upperCase = 0;
int lowerCase = 0;
printf("Requirements for a valid password:\n\n");
printf("1. Contain at least one $ sign.\n");
printf("2. Contain at least one number.\n");
printf("3. Contain at least one uppercase letter.\n");
printf("4. Contain at least one lowercase letter.\n");
printf("5. Contain no more than 20 characters.\n\n");
printf("Enter password: ");
scanf(" %s", &password);
printf("\n");
for (loop = 0; loop < 21; loop++) {
if (password[loop] == '$') {
dollar = 1;
break;
}
else {
printf("Invalid password, recheck for condition 1.\n\n");
break;
}
}
for (loop = 0; loop < 21; loop++) {
if (isdigit(password[loop])) {
digit = 1;
break;
}
else {
printf("Invalid password, recheck for condition 2.\n\n");
break;
}
}
for (loop = 0; loop < 21; loop++) {
if (isupper(password[loop])) {
upperCase = 1;
break;
}
else {
printf("Invalid password, recheck for condition 3.\n\n");
break;
}
}
for (loop = 0; loop < 21; loop++) {
if (islower(password[loop])) {
lowerCase = 1;
break;
}
else {
printf("Invalid password, recheck for condition 4.\n\n");
break;
}
}
if ((dollar * digit * upperCase * lowerCase) != 0) {
printf("Password saved!");
}
system("pause");
return(0);
}
答案 0 :(得分:3)
因此,让我们在这里进行简单的空运行。让我们将您的代码用于第一个条件(并且在逻辑上保持所有相同,因此应该这样做)。
for (loop = 0; loop < 21; loop++) {
if (password[loop] == '$') {
dollar = 1;
break;
}
else {
printf("Invalid password, recheck for condition 1.\n\n");
break;
}
}
让我们以loop
的值等于零开始。现在存在以下条件:
$
。在这种情况下,if
条件是令人满意的,我们在设置dollar
标志后退出。$
(这是我们主要要出错的地方)。 if
条件失败,正如预期的那样-因此我们直接进入else
。在这里,我们继续打印错误消息并跳出循环,而无需检查其余字符!从逻辑上讲,我们应该等待打印错误,直到处理完所有字符并没有找到满足条件为止。因此,现在我们了解了问题-我们正在打印错误,并且仅在检查了第一个字符后就开始执行。但是,我们该如何解决呢?
好吧,对于初学者来说,我们应该等到搜索所有字符为止。因此,其他部分必须移出循环。另外,我们知道,如果确实满足条件,则将设置dollar
变量,然后退出循环。如果我们发现条件不满足怎么办?好吧,在那种情况下,dollar
将保持为零-这就是我们检测错误的方式!
因此,我们可能会做类似的事情:
// Loop through the characters, and as soon as we find $ we set the dollar variable and break
for (loop = 0; loop < 21; loop++) {
if (password[loop] == '$') {
dollar = 1;
break;
}
}
// If dollar is still zero, we didn't encounter the $ character
if (dollar == 0) {
printf("Invalid password, recheck for condition 1.\n\n");
}
您发布的代码中还有其他一些简单的错误,但是主要的逻辑缺陷是上述缺陷。寻找注释以了解其他可能的漏洞。干杯!