验证2位数最小C语言

时间:2014-11-10 23:24:24

标签: c validation passwords

我的工作是使用以下方法制作密码验证器:

  1. 不允许空格
  2. 1符号
  3. 2位数
  4. 最少6个字符
  5. 最多10个字符
  6. 只是上述限制,到目前为止,我单独完成了1245,我无法解决关于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;}
    

3 个答案:

答案 0 :(得分:0)

  • RegEx搜索[^0-9]输入字符串并全部替换为空。
  • 将剩余的字符串验证为两个字符。

答案 1 :(得分:0)

那不是真正的regex。你有什么基本上是一个小程序,检查其输入的不同条件。所以,以同样的方式,为了确保你有2位数,让我们创建一个计算位数的函数。请记住,在ASCII中,数字0到9是连续的块(这非常重要,正如您将看到的那样)。

int countDigits(char *input) {
    int digitCount = 0;
    for (int i = 0; i < strlen(input); i++)      // for every character
        if (input[i] >= '0' && input[i] <= '9')  // if it is a digit
            digitCount++;
    return digitCount;
}

我用这种方式编写了这个函数来介绍一些角色操作技巧。如果条件是:

会更好
if (isdigit(input[i]))

出于携带原因。请注意,函数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;
}

现在您只需要使用此功能并检查它是否为您输入的输入返回2.

答案 2 :(得分:0)

  1. 没有理由使用小型缓冲区。使用pass[11]

    无法正确完成测试#5
    // char pass[11];
    char pass[100];
    
  2. 使用无限长度输入很危险。改为

    scanf(" %99[^\n]",pass);
    
  3. 计算数字

    int cnt = 0;
    for (i=0; pass[i]; i++) {
      if (pass[i] >= '0' && pass[i] <= '9') cnt++;
    }
    if (cnt != 2) BadPsss();