输入数据
输入数据有若干行,每行为一个字符串,表示密码。
输出数据
对每行输入,请在单独的行中输出密码强度的判定结果。
若密码无效(即密码含空格),请输出invalid。
若密码有效且是强密码,则输出true,否则输出false。
一般认为有效的密码中不应该包含空格,且应该具备一定的强度。一个强密码长度应不少于8位字符,且满足以下4种条件中至少3种:
密码含有至少一个小写字母
密码含有至少一个大写字母
密码含有至少一个数字
密码含有至少一个特殊符号,特殊符号包括 ()`!@#$%^&*_-+=|{}[]:;'<>,.?
自己写的代码不知道为什么输入aws会输出两个false(这个是我上个问题的完整版)
#include
int main() {
char c;char c_tmp;
int a, b, e, d,f=0;
while ((c = getchar()) != EOF) {
a = b = e = d = 0;
while (c != '\n') {if(c==' '){printf("invalid\n");while ((c_tmp = getchar() != '\n') && c_tmp != EOF);continue;}
f++;
if(f<8){printf("false\n");f=0;
while ((c_tmp = getchar() != '\n') && c_tmp != EOF);
continue;
}
if (c >= 'a' && c <= 'z') {
a = 1;
} else if (c >= 'A' && c <= 'Z') {
e = 1;
} else if (c >= '0' && c <= '9') {
b = 1;
} else if (c == '(' || c == ')' || c == '`' || c == '!' ||
(c >= '@' && c <= '[') ||
(c >= ']' && c <= '_') || c == '-' || c == '+' ||
c == '=' || c == '|' || (c >= '{' && c <= '}') ||
c == ';' || c == ':' || c == '<' || c == '>' ||
c == ',' || c == '.') {
d = 1;
}
c = getchar();
}
if (a + b + e + d >= 3) {
printf("true\n");
} else {
printf("false\n");
}
}
return 0;
}
getchar()函数赌到的是字符串“awe”和“\n”
所以会出现两次。
具体情况可以百度getchar()和回车,算是个入门常见问题了
#include<stdio.h>
void finddog(int a[], int sz, int* num)
{
int i = 0;
int pos = 0;
int ret = 0;
//遍历数组,结果为两个不同数的异或。
for (i = 0; i < sz; i++)
{
ret ^= a[i];
}
//寻找这两个不同数异或结果的一个位为 1 的位
for (pos = 0; pos < 32; pos++)
{
if (((ret >> pos) & 1) == 1)//整型 32 位,从低位向高位依次遍历
{
break; //pos记录二进制位为 1 的数
}
}
for (i = 0; i < sz; i++)
{
//找到数组中pos位为1的数,并进行异或
if (((a[i] >> pos) & 1) == 1)
{
num[1] ^= a[i];
}
//找到数组中pos位为0的数,并进行异或
else
{
num[0] ^= a[i];
}
}
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 2, 1, 3 };
int num[2] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
finddog(arr, sz, num);
printf("%d %d\n", num[0], num[1]);
return 0;
}