Программа для ввода пароля - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Решил ради интереса написать программу, которая как-бы регистрирует пользователя. Необходимо ввести пароль. В случае если условия соблюдаются [Только заглавные и строчные буквы, цифры (обязательно, чтобы они были) и длина пароля не больше 20 символов], то пароль засчитывается. Если нет, то пароль не засчитывается. У меня есть несколько вопросов. 1. Строки 13-26. Например я ввожу 20 символов, жму Enter, затем Cntrl+Z и опять Enter. Почему в итоге у меня получается 21 символ. 21 символ это '\n'? Но почему же он тогда оказался 21 элементом массива, если у меня по условию в массив вводятся только буквы и цифры. И второй вопрос. Как можно было бы улучшить эту программу? А то как по мне какая-то херотень громоздкая вышла. Хочется улучшить программу. Спасибо!
#include <stdio.h>
 
int main() {
    int num = 0; //кол-во знаков в пароле
    int i; //счетчик
    int password[21]; //пароль
    int c; //символ
    int A = 0; //заглавные буквы
    int a = 0; //строчные буквы
    int d = 0; //цифры
    int check = 1; //t/f
 
    while ((c = getchar()) != EOF) {
        if (((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) && (check == 1) && (num <= 20)) {
            password[num] = c;
            num++;
            if (c >= 'A' && c <= 'Z')
                A++;
            if (c >= 'a' && c <= 'z')
                a++;
            if (c >= '0' && c <= '9')
                d++;
        }
        else if (c!='\n')
            check = 0;
    }
    
    if (check == 0)
        printf("Fu!");
    else if ((A >= 1) && (a >= 1) && (d >= 1)) {
        printf("OK!\n");
        for (i = 0; i <= num-1; i++)
            printf("%c", password[i]);
    }
 
    printf("\n");
    system("pause");
    return 0;
}
Доработанная версия.
#include <stdio.h>
 
int main() {
    int num = 0; //кол-во знаков в пароле
    int i; //счетчик
    int password[21]; //пароль
    int c; //символ
    int A = 0; //заглавные буквы
    int a = 0; //строчные буквы
    int d = 0; //цифры
    int check = 1; //t/f
 
    while ((c = getchar()) != EOF) {
        if (((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) && (check == 1) && (num <= 20)) {
            password[num] = c;
            num++;
            if (c >= 'A' && c <= 'Z')
                A++;
            if (c >= 'a' && c <= 'z')
                a++;
            if (c >= '0' && c <= '9')
                d++;
        }
        else if (c!='\n')
            check = 0;
    }
    
    if (check == 0)
        printf("Fu!");
    else if ((A >= 1) && (a >= 1) && (d >= 1)) {
        printf("OK!\n");
        for (i = 0; i <= num-1; i++)
            printf("%c", password[i]);
    } else 
               printf("FU!");
 
    printf("\n");
    system("pause");
    return 0;
}
Номер 3.
#include <stdio.h>
 
int main() {
    int num = 0; //кол-во знаков в пароле
    int i; //счетчик
    int password[21]; //пароль
    int c; //символ
    int A = 0; //заглавные буквы
    int a = 0; //строчные буквы
    int d = 0; //цифры
    int check = 1; //t/f
 
    while ((c = getchar()) != EOF) {
        if (((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) && (check == 1) && (num <= 20)) {
            password[num] = c;
            num++;
            if (c >= 'A' && c <= 'Z')
                A++;
            if (c >= 'a' && c <= 'z')
                a++;
            if (c >= '0' && c <= '9')
                d++;
        }
        else if (c!='\n')
            check = 0;
    }

    if ((A >= 1) && (a >= 1) && (d >= 1) && (check != 0)) {
        printf("OK!\n");
        for (i = 0; i <= num-1; i++)
            printf("%c", password[i]);
    }
    else 
        printf("FU!");
 
    printf("\n");
    system("pause");
    return 0;
}
И да! Еще стоит учитывать, что в этом коде отображаются все мои знания синтаксиса языка. То етсь нужно именно в рамках моих знаний.

Решение задачи: «Программа для ввода пароля»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
#define MAX_PASSWORD_LENGTH (20)
const char * REQUIRED_SYMBOLS[] = {
    "0123456789",
    "abcdefghijklmnopqrstuvwxyz",
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
    NULL
};
 
int test_password(const char * s, const size_t maxLength, const char ** dict) {
    if ( strlen(s) <= maxLength ) {
        const char ** pDict;
        const char * pS;
        
        for ( pS = s; *pS; ++pS ) {
            for ( pDict = dict; *pDict && ! strchr(*pDict, *pS); ++pDict )
                ;
            if ( ! *pDict )
                return 1;
        }
        
        for ( ; *dict && strpbrk(s, *dict); ++dict )
            ;
        return ( *dict != NULL );
    }
    
    return 1;
}
 
int main(void) {
    char buf[256];
    
    while ( printf("Password: ") && scanf("%255s", buf) == 1 )
        printf("%s\n", ( test_password(buf, MAX_PASSWORD_LENGTH, REQUIRED_SYMBOLS) ) ? "REJECTED" : "ACCEPTED");
    
    return 0;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: stdio.h, string.h и ctype.h
  2. Определяется максимальная длина пароля, которая составляет 20 символов и помещается в переменную MAX_PASSWORD_LENGTH
  3. Создается массив символов, которые должны присутствовать в пароле, и помещается в переменную REQUIRED_SYMBOLS
  4. В функции test_password() происходит проверка пароля на соответствие требованиям. Функция принимает три параметра: s - пароль, maxLength - максимальная длина пароля и dict - массив символов для проверки. Внутри функции создаются два указателя: pS - указывает на текущий символ пароля и pDict - указывает на текущий символ в массиве символов для проверки. Затем происходит проверка каждого символа пароля на наличие в массиве символов для проверки. Если символ не найден, то возвращается 1, иначе функция продолжает проверку следующего символа. После проверки всех символов пароля происходит проверка на превышение максимальной длины пароля. Если длина пароля превышает максимальную, то возвращается 1. Если все символы пароля прошли проверку и длина пароля не превышает максимальную, то возвращается 0.
  5. В функции main() создается буфер для хранения введенного пароля и инициализируется длиной 256 символов. Затем пользователю предлагается ввести пароль до тех пор, пока он не введет неправильный пароль или не прервет выполнение программы. Каждый введенный пароль проверяется функцией test_password() и выводится соответствующее сообщение: REJECTED или ACCEPTED.
  6. Программа завершается возвратом значения 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы