c语言多行输入 判断是否符合条件

输入数据
输入数据有若干行,每行为一个字符串,表示密码。

输出数据
对每行输入,请在单独的行中输出密码强度的判定结果。

若密码无效(即密码含空格),请输出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()和回车,算是个入门常见问题了

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/204349
  • 这篇博客你也可以参考下:您的账户已被停用,请向系统管理员咨询 解决方案(亲测有效)
  • 除此之外, 这篇博客: 初学C语言【14】寻找单身狗中的 方法二 :异或(两数,相同为 0 ,相异为 1 ),整个数组全部元素进行异或,出现两次的元素异或为“0”,最后的结果不可能是零(否则没有单身狗了,不可能,我就是单身狗),寻找数组元素异或后二进制为 1 的位置(区别),然后将该数组分为两组,一组该二进制位全为 1 ,将数组中该位为1的所有数异或,因为数组中相同的数异或为0,仅留下该位为1的单身狗数;另外一组该位全为0,同理,该位为0的所有数异或,最后仅留下该位为0的单身狗数。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #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;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^