验证最少2位C语言

验证最少2位C语言,c,validation,passwords,C,Validation,Passwords,我的工作是使用以下各项制作密码验证程序: 不允许有空格 1符号 2位数 最少6个字符 最多10个字符 仅上述限制,到目前为止,我已经单独完成了1、2、4、5,并且我无法解决关于2位数字的第三个要求。我只能用1个数字,那么我如何用2个数字呢?我认为正则表达式不象C.中的C++和C语言那样工作,这里是我的代码: #include <stdio.h> #include <string.h> int main(){ char pass[11]; int sto

我的工作是使用以下各项制作密码验证程序:

  • 不允许有空格
  • 1符号
  • 2位数
  • 最少6个字符
  • 最多10个字符
  • 仅上述限制,到目前为止,我已经单独完成了
    1
    2
    4
    5
    ,并且我无法解决关于2位数字的第三个要求。我只能用1个数字,那么我如何用2个数字呢?我认为正则表达式不象C.中的C++和C语言那样工作,这里是我的代码:

    #include <stdio.h>
    #include <string.h>
    
    int main(){
    
        char pass[11];
        int stop;
    
        printf("Give password:\n");
        scanf(" %[^\n]s",pass);
    
        do{
            if(strlen(pass)<6){
                stop=0;
                printf("Too short password.");
            }
            else if(strlen(pass)>10){
                stop=0;
                printf("Too long password.");
            }
            else if(strchr(pass, ' ')){
                stop=0;
                printf("No spaces.");
            }
            else if((strchr(pass, '$')==NULL && strchr(pass, '#')==NULL && strchr(pass, '@')==NULL && strchr(pass, '!')==NULL && strchr(pass, '%')==NULL && strchr(pass, '*')==NULL)){
                stop=0;
                printf("Must give at least one of $, #, @, !, %% or *.");
            }
            else{
                stop=1;
                printf("Your password is %s\n", pass);
            }
        }while(stop=0);
    
        return 0;}
    
    #包括
    #包括
    int main(){
    charpass[11];
    int stop;
    printf(“给出密码:\n”);
    scanf(“%[^\n]s”,通过);
    做{
    if(斯特伦(通过)10){
    停止=0;
    printf(“密码太长”);
    }
    否则,如果(strchr(通过“”){
    停止=0;
    printf(“无空格”);
    }
    else if((strchr(pass,“$”)==NULL&&strchr(pass,“#”)==NULL&&strchr(pass,“@”)==NULL&&strchr(pass,“!”)==NULL&&strchr(pass,“%”)==NULL&&strchr(pass,“*”)==NULL)){
    停止=0;
    printf(“必须至少提供美元、#、@、!、%%或*)中的一种);
    }
    否则{
    停止=1;
    printf(“您的密码是%s\n”,pass);
    }
    }while(stop=0);
    返回0;}
    
    • 正则表达式搜索输入字符串并全局替换为空
    • 验证剩余字符串的长度是否为两个字符
      • 这不是一个真正的问题。这里基本上是一个小程序,它检查不同条件下的输入。同样,为了确保有2个数字,让我们创建一个计算数字数的函数。请记住,在ASCII中,数字0到9位于连续块中(这非常重要,您将看到)

        为了便于携带。注意,函数isdigit是在ctype.h头中定义的。还有一些改进的余地:

        int countDigits(char *input) {
            int digitCount = 0;
            int noOfCharacters = strlen(input);          // avoid strlen() being called
                                                         // for every iteration
            for (int i = 0; i < strlen(input); i++)      // for every character
                digitCount += isdigit(input[i]);
        
            return digitCount;
        }
        
        int countDigits(字符*输入){
        int-digitCount=0;
        int noOfCharacters=strlen(输入);//避免调用strlen()
        //每次迭代
        对于(int i=0;i
        现在您只需要使用这个函数,并检查它是否为您得到的输入返回2

      • 没有理由使用小的ish缓冲区。如果
        pass[11]

        // char pass[11];
        char pass[100];
        
      • 使用无限长输入是危险的。改为

        scanf(" %99[^\n]",pass);
        
      • 数一数数字

        int cnt = 0;
        for (i=0; pass[i]; i++) {
          if (pass[i] >= '0' && pass[i] <= '9') cnt++;
        }
        if (cnt != 2) BadPsss();
        
        int cnt=0;
        for(i=0;通过[i];i++){
        
        如果(pass[i]>='0'&&pass[i]你能想出一种计算数字的方法吗?注意:从
        中删除
        s
        (“%[^\n]s”
        。这是不需要的。复杂的密码规则通常不会产生更安全的密码,重要的是密码的最小长度。人们记不住大量的强密码,这样的规则可能会干扰良好的密码方案。人们可以很有创意地绕过这些规则,例如使用“password-2014”这样的弱密码。通常情况下,您的密码会变弱,而不是变强。在任何情况下,您都应该删除10个字符的上限。
        if(isdigit(输入[i])
        并不比
        if(输入[i]>='0'&&input[i]好好的,@Paul92谢谢,你的回答让我想得更清楚了!我以为这是正则表达式..因为我在C#和Java中看到了一些类似的验证代码,他们用正则表达式进行验证…不管怎样,现在我很好,它工作得很好。你能告诉我为什么使用无限长输入很危险吗?还有小的缓冲区,我不明白为什么是100?我的字符串最大值为10+\0=11,所以pass[11]可以。有什么问题吗?@Sotnam96我看你们都准备好接受答案了。嗯。哦,好吧。如何使用代码来获得“太长的密码”?当然输入了比10长的内容,如“12345678901”。这需要11+1
        char
        来保存,填充过多
        char pass[11]
        。您的代码今天没有崩溃,否则您会对此采取一些措施,但它确实过量填充了缓冲区-谁知道会损坏什么。因此,您需要一个大于
        pass[11]
        的缓冲区来测试字符串长度>10。@Sotnam96
        scanf(“%[^\n]”,pass)的危险之处在于
        ?正如您所经历的,对正确代码的错误感觉。黑客的许多安全漏洞利用了这样的代码。关于这种黑客行为,有很多帖子都是这样写的。健壮的代码可以防止缓冲区溢出。使用
        char pass[100];…scanf(“%99[^\n]”,pass);
        按照建议,将用户输入限制为99
        char
        ,因为99+1(
        '\0'
        char
        可以保存。如果用户输入的字符数超过99
        char
        ,则最多只能读取99
        char
        ,而额外的输入仍保留在
        stdin
        中。至少
        pass
        不会被过度填充。
        scanf(" %99[^\n]",pass);
        
        int cnt = 0;
        for (i=0; pass[i]; i++) {
          if (pass[i] >= '0' && pass[i] <= '9') cnt++;
        }
        if (cnt != 2) BadPsss();