我不太明白您为什么要使用一组 15 个字符长的密码,但我想您的标准仅指其中一个密码,而不是其他密码:您想检查密码是否需要考虑一个“好”的密码;这是我的理解。然后...
该功能gets
相当不安全。避免使用它。
这个想法是要求输入密码,检查它并在它不符合您的标准时循环。当然,没有一种方法可以做到这一点。
// include files for I/O funcs
#include <stdio.h>
for(;;)
{
printf("insert pwd: ");
gets(buffer); // argh I've said: don't use this
if ( !pass_criteria(buffer) ) {
printf("criteria are ....\n");
} else break;
}
然后 pass_criteria 可能类似于
// include files for strlen and is* funcs
#include <ctype.h>
#include <string.h>
int pass_criteria(const char *buf)
{
int upcount, lowcount, numcount;
if (strlen(buf) < minimum_pass_len ||
strlen(buf) > max_pass_len) return 0; // 0 being false
for (int i = 0; i < strlen(buf); ++i) {
if (isdigit(buf[i]) numcount++;
if (isupper(buf[i]) upcount++;
if (islower(buf[i]) lowcount++;
}
return numcount > 0 && upcount > 0 && lowcount > 0;
}
更改标准很容易,例如,如果您想要至少 2 个数字(数字)、放置numcount > 1
等等。
而不是得到
获取缓冲区溢出是危险的。尝试像这样使用例如 fgets:
fgets(buffer, buffer_size, stdin);
您的缓冲区的大小在哪里buffer_size
(在您的情况下为 15,但避免使用文字常量;更喜欢适当的#define
或使用sizeof
,例如sizeof (password[0])
。另请注意, fgets 不会丢弃最终的换行符。