如何循环字符串?

时间:2018-07-11 08:11:05

标签: c

为了使自己熟悉基础知识,我一直在尝试编写一个用于选择密码的简单程序。密码应符合列出的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);
}

1 个答案:

答案 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的值等于零开始。现在存在以下条件:

  1. 第一个字符是$。在这种情况下,if条件是令人满意的,我们在设置dollar标志后退出。
  2. 第一个字符不是 $(这是我们主要要出错的地方)。 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");
}

您发布的代码中还有其他一些简单的错误,但是主要的逻辑缺陷是上述缺陷。寻找注释以了解其他可能的漏洞。干杯!