我想构建一个简单的程序,检查用户是否输入了至少包含一个大写字母,一个数字和一个符号的密码。然后如果真的打印“这是一个强密码”。 但是,当我开始测试时,如果我输入像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;
}
欢迎任何改进它的想法。
答案 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++) {
当它到达字符串中的终止空字符时,它将停止。