Как я могу убедиться, что нет ограничений на длину пароля? - PullRequest
0 голосов
/ 03 января 2019

Я написал код на 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 голосов
/ 03 января 2019

Если вы действительно хотите неограниченную длину (хотя ее полезность несколько сомнительна - возможно, лучше просто выбрать большой лимит и покончить с ним), вам придется отказаться от scanf для чего-то вроде fgets это позволяет указать, сколько символов нужно прочитать, а затем прочитать ввод в виде фрагментов.Возможно, вы захотите использовать простую для роста структуру (например, связанный список строковых буферов размером чуть меньше страницы) для чтения в этих чанках, а затем выделить буфер для окончательной строки, как только вы нажметесимвол новой строки (или EOF, в зависимости от желаемой семантики) в вашем вводе.

0 голосов
/ 03 января 2019

Просто обрабатывайте один символ пароля за раз; нет необходимости хранить все это в памяти сразу.

#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");
}
0 голосов
/ 03 января 2019

Самый простой способ - использовать fgets.Обратите внимание, что scanf("%s") получит только одно слово, а в некоторых паролях могут быть пробелы.Но настоящая причина использования fgets заключается в том, что вы можете предотвратить переполнение, как показано ниже:

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

Это самое простое решение.

Но, если вы действительно вам нужен большой пароль [неопределенной длины], вы можете вырастить переменную 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...