如何确保密码可以使用多长时间没有限制?

时间:2019-01-03 00:24:45

标签: c

我用C语言编写了一个代码,其中用户必须在密码中包含“ $”,数字和大写字母才能使其有效,但是我对如何使密码可以使用感到困惑。只要他们想要,就不用我写char password[100000000000]之类的东西。

int something = 100;
char password[something];
int index = 0;
int x = 0;
int y = 0;
int z = 0;

printf("Enter Password: "); //Mike$4
scanf("%s", password);

do{ // If index is strlen, then we checked every char of pw
    // Ex. Password is length 6, then index 0 - 5 will be checked
    if(index == strlen(password) && x>0 && y>0 && z>0){
        printf("Good password!");
        break;
    }
    if(index == strlen(password) && (x==0 || y==0 || z==0)){
        printf("BAD PASSWORD");
        break;
    }

    if(isupper(password[index]) ||  isdigit(password[index]) ||
       password[index] == '$'){

         if(isupper(password[index])){
                x++; index++;
                continue;}
         if(isdigit(password[index])){
                y++; index++;
                continue;}
         if(password[index] == '$'){
                z++; index++;
                continue;}
    }else{index++;
          continue;
          }
}while(index <= strlen(password));

这是我的代码。谢谢!

3 个答案:

答案 0 :(得分:2)

如果您确实想要无限的长度(尽管它的实用性有点可疑-选择一个大的限制并完成它可能会更好),您将不得不放弃scanf来进行类似的操作fgets允许您指定要读取的字符数,然后分块读取输入。您可能希望使用易于增长的结构(例如,页面大小略小于页面大小的字符串缓冲区的链表)读取这些块,然后在命中一个字符串时为最后一个字符串分配缓冲区输入中的换行符(或EOF,具体取决于所需的语义)。

答案 1 :(得分:1)

最简单的方法是使用fgets。请注意,scanf("%s")仅会得到一个单词,并且某些密码可能带有空格。但是,使用fgets的真正原因是可以防止溢出,如下所示:

char password[1000];
fgets(password,sizeof(password),stdin);
char *cp = strchr(password,'\n');
if (cp != NULL)
    *cp = 0;

那是最简单的解决方案。

但是,如果您真的需要一个[em]大密码[长度不明],则可以从password扩展realloc变量,只需就像对动态数组所做的那样:

char *password = NULL;
int pwmax = 0;
int pwlen = 0;

void *
xrealloc(void *ptr,size_t len)
{
    void *tmp;

    tmp = realloc(ptr,len);
    if (tmp == NULL) {
        free(ptr);
        exit(1);
    }

    return ptr;
}

while (1) {
    int chr = fgetc(stdin);
    if (chr == EOF)
        break;
    if (chr == '\n')
        break;

    if (pwlen >= pwmax) {
        if (pwlen >= 1000000) {
            fprintf(stderr,"password beyond reasonable max limit\n")
            exit(1);
        }
        pwmax += 100;
        password = xrealloc(password,pwmax);
    }

    password[pwlen++] = chr;
}

password = xrealloc(password,pwlen + 1);
password[pwlen] = 0;

答案 2 :(得分:0)

一次只处理一个字符的密码;无需一次全部存储在内存中。

#include <ctype.h>
#include <stdio.h>
#include <stdbool.h>


int main(void)
{
    printf("Enter password: ");

    bool SawDollar = false;
    bool SawDigit  = false;
    bool SawUpper  = false;

    while (1)
    {
        int c = getchar();
        if (c == EOF || isspace(c))
            break;

        if (c == '$')
            SawDollar = true;
        else if (isdigit(c))
            SawDigit = true;
        else if (isupper(c))
            SawUpper = true;
    }

    if (SawDollar && SawDigit && SawUpper)
        printf("Good password!\n");
    else
        printf("Bad password.\n");
}