C

时间:2016-08-12 10:42:57

标签: c

我想构建一个简单的程序,检查用户是否输入了至少包含一个大写字母,一个数字和一个符号的密码。然后如果真的打印“这是一个强密码”。 但是,当我开始测试时,如果我输入像SS2这样的通行证,它就算是一个强密码......

int issymbol(int password) {
    if (password >= 33 && password <= 47) return 1;
    else if (password >= 58 && password <= 64) return 1;
    else if (password >= 91 && password <= 96) return 1;
    else if (password >= 123 && password <= 126) return 1;
    else return 0;
}

int main()
{
    char password[7];
    int i;
    int u, d, s;        // u - uppercase character
                        // d - digit
    u = d = s = 0;      // s - symbol

    scanf("%s", password);

    for(i = 0; i < 7; i++) {
        if ( isupper(password[i]) && (u == 0) )
            u++;
        if ( isdigit(password[i]) && (d == 0) )
            d++;
        if ( issymbol(password[i]) && (s == 0) )   // Checks if password[i] is a symbol
            s++;
        if ( (u + d + s) >= 3) {
            printf("Your password is strong!\n");
            break;
        }
    }

    if ( (u + d + s) < 3)  printf("Your password is weak:(\n");

    return 0;
}

欢迎任何改进它的想法。

3 个答案:

答案 0 :(得分:3)

你的意思是setLevel强密码?然后你可以放弃写作if (u >= 1 && d >= 1 && s >= 1)等等的单调乏味。

您当前的测试只不过是一个字符数。

此外,您的代码非常脆弱:如果用户输入超过6个字符,则会出错:请记住为nul-terminator && (u == 0)设置一个字节。作为绝对最小值,请写\0并将循环运行到第一个scanf("%6s", password);而不是7.请参阅How to prevent scanf causing a buffer overflow in C?以获取更多详细信息。

答案 1 :(得分:0)

int issymbol(int password)

您的变量password应为char类型,以检查符号而不是int

编辑:

scanf("%s", password);

始终在%s之前放置空格,例如

scanf(" %s", password)

这将终止所有之前的\n

答案 2 :(得分:0)

问题在于您检查的字符多于您输入的字符数。如果您输入SS7,则只需检查3个字符,但for循环会检查7中的所有password个字符。 password[3]之后的字符将被取消初始化,并且可能包含符合要求的字符。

将循环更改为:

for (i = 0; password[i]; i++) {

当它到达字符串中的终止空字符时,它将停止。