Попытка создать программу, которая проверяет, содержит ли пароль заглавную букву и число в c - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь создать программу, которая проверяет, содержит ли созданный пароль заглавную букву и число. Оба цикла for выполняются нормально, если только один из них записан без другого (один l oop работает нормально, если я закомментирую другой l oop), но если я наберу их оба вместе, только второй для l oop (это связано с проверкой, есть ли номер или нет) работает, а другой не работает.

Так что с письменным кодом ниже, если я введу пароль, который не содержит заглавную букву или номер я получаю «Пожалуйста, убедитесь, что ваш пароль содержит номер и попробуйте снова». только сообщение.

Примечание:

  • Я попытался использовать присвоение целого числа i нулю после первого l oop и использование его во втором l oop вместо х, но я получаю тот же результат.

  • Я использую компилятор code :: blocks.

Может кто-нибудь указать, где я go не так?

Извините, если вопрос недостаточно ясен, это мой первый вопрос здесь в stackoverflow, и спасибо заранее.

Код:

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

int main()

{

    char password[25];

    int i;

    int x;

    printf("Create a strong password (must contain an uppercase letter and a number, and must be at least 8 characters) :\n");
    scanf(" %s", password);



    for (i = 0; i <= 25; i++)
    {

        if ( isupper(password[i]) == 1 )
        {
            break;
        }

        if (i == 25)
        {
            printf("\nPlease make sure that your password contains an uppercase letter and try again.\n");
        }


    }


      for (x = 0; x <= 25; x++)
    {

        if (isdigit(password[x]) == 1)
        {
            break;
        }

        if ( x == 25 )
        {
             printf("\nPlease make sure that your password contains a number and try again.\n");
        }

    }

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 14 февраля 2020

В вашем коде есть ряд проблем, которые я попытаюсь здесь решить.

Во-первых, как уже упоминалось в комментариях, ваши два цикла for будут (скорее всего) go " за пределами », как индексы массива в C, начинающиеся с ноль и заканчивающиеся на« n - 1 »(где« n »- размер массива).

Во-вторых, Функции isupper() и isdigit() (обязательно) не возвращают «1» для «положительного результата» - спецификация гласит только, что они возвращают ненулевое . Таким образом, мы можем просто проверить возвращаемое значение как «логическое» значение (ноль будет равняться «ложному», а любой ненулевой будет равняться «истинному»).

Наконец, вместо того, чтобы запускать циклы for для всего буфера password, вам нужно запускать только до тех пор, пока не будет найден завершающий символ nul - после этого вы узнаете, что требуемая заглавная буква или ди git не включены в строка.

Вот «рабочая» версия вашего кода с добавленными комментариями, где я внес изменения:

int main()
{
    char password[25];
    int i;
    int x;
    printf("Create a strong password (must contain an uppercase letter and a number, and must be at least 8 characters) :\n");
    scanf(" %s", password);
    for (i = 0; i < 25; i++) { // password[24] is the last possible element - NOT password[25].
        if (isupper(password[i])) { // "isupper()" will return NON-ZERO (but not necessarily 1!)
            break;
        }
        else if (password[i] == '\0') { // we've reached the end of the string and not found an uppercase...
            printf("\nPlease make sure that your password contains an uppercase letter and try again.\n");
            break;
        }
    }
    for (x = 0; x < 25; x++) { // as before, use "x < 25" rather than "x <= 25"
        if (isdigit(password[x])) { // "isdigit()" will return NON-ZERO (but not necessarily 1!)
            break;
        }
        else if (password[x] == '\0') { // we've reached the end of the string and not found a digit...
            printf("\nPlease make sure that your password contains a number and try again.\n");
            break;
        }
    }
    return 0;
}
0 голосов
/ 14 февраля 2020

Вот код C ++, который использует регулярные выражения (с небольшим трудом это можно сделать в C?)

#include <iostream>
#include <iterator>
#include <string>
#include <regex>

int main()
{
    std::string s = "tkfgfff3gf";


    std::regex word_regex("(\[[:upper:]])");    


    auto words_begin = 
        std::sregex_iterator(s.begin(), s.end(), word_regex);
    auto words_end = std::sregex_iterator();

    int count =std::distance(words_begin, words_end);

    if(count == 0)
    {
        std::cout<<"Please make sure that your password contains an uppercase letter and try again";
    }

    std::regex number_regex("(\[0-9])");

    auto number_begin = 
        std::sregex_iterator(s.begin(), s.end(), number_regex);
    auto number_end = std::sregex_iterator();

    count =std::distance(number_begin, number_end);

    if(count == 0)
    {
        std::cout<<"Please make sure that your password contains a number and try again";
    }

    return 0;


} 
0 голосов
/ 14 февраля 2020

Здесь у вас есть простая функция:

int isCapitalAndDigit(const char *pwd, int minsize)
{
    int isCapitalLetter = 0, isDigit = 0;
    size_t len = 0;

    while(*pwd && (!(isDigit && isCapitalLetter) || len < minsize) )
    {
        if(isdigit(*pwd)) isDigit = 1;
          else if(isalpha(*pwd) && !islower(*pwd)) isCapitalLetter = 1;
        pwd++;
        len++;
    }
    return isDigit && isCapitalLetter && (len >= minsize);
}

https://godbolt.org/z/53XrhW

...