BooleanBabe Ответов: 5

Почему моя программа паролей находит символы, которые не существуют в пользовательском вводе?


Привет кодерам и Кодессам!

Итак, у меня наконец-то есть рабочая программа после многих корректировок...Но когда я запускаю его, он каким-то образом умудряется подбирать символы, которых даже нет в пользовательском вводе!

Это мой код.:

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

int main()
{
    int i;
    char password[50];
    int upper = 0;
    int number = 0;
    int dollarSign = 0;
    
//ask the user to input a password containing an uppercase letter and number and $ sign

    printf("Please enter a password containing an Uppercase letter, a number and a $ sign: ");
    scanf(" %s", password);
    
//now we check if the password given contains an uppercase letter, a number and a $ sign

    for( i = 0; i < 50; i++)
    {
        if ( isalpha(password[i]))
        {
            if( isupper(password[i]))
            {
            upper += 1;
            printf("Your password contains an Uppercase letter: %c\n", password[i]);
            break;
            }
        }
    }
    
    for( i = 0; i < 50; i++)
    {
        if ( isdigit(password[i]))
        {
            number += 1;
            printf("Your password contains a number: %c\n", password[i]);
            break;
        }
    }
    
    for( i = 0; i < 50; i++)
    {   
        if (password[i] == '$')
        {
            dollarSign += 1;
            printf("Your password contains a dollar sign: %c\n\n", password[i]);
            break;
        }
    }
    
//now we give the user final feedback on whether their password is acceptable or not

    if ( (upper == 1)  && (number == 1) && (dollarSign == 1) )
    {
        printf("You have a strong password!\n");
    }
    else
    {
        printf("Your password sucks!\n");
    }
  
    return 0;
}



(Старая часть вопроса...пожалуйста, не обращайте внимания

Я новичок и у меня есть следующая проблема вызов:
Создайте программу, в которой пользователь вводит пароль, и программа сканирует его, проверяя наличие прописной буквы, цифры и знака"$".

Поскольку я настолько Новичок, что действительно понятия не имею, как решить эту проблему, и любая помощь будет очень признательна :)

Это мой код.:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
    char password[50];
    int i;
    int goodPassword = 0;

    printf("Enter a password containing an Uppercase letter, a number and a $ sign\n");
    scanf(" %s", password);

    for(i=0; i<=50; i++){
        if(isupper(password[i])) && (isdigit(password[i])) && (password[i] == '$'){
            goodPassword = 1;
            printf("Good to go!");
            break;
        }else{
            printf("It sucks!");
        }
        }
        return 0;
}
)

What I have tried:

So the first user password input I ran was: eHello$1 

This worked perfectly!

Then I ran tested a user input of: iamsam

Please enter a password containing an Uppercase letter, a number and a $ sign: iamsam
Your password contains an Uppercase letter: L
Your password sucks!

Where does it get the 'L' from? lol

and one more attempt with just a single letter: i

<pre>Please enter a password containing an Uppercase letter, a number and a $ sign: i
Your password contains a number: 0
Your password sucks!

It now tells me the password contains a 0.

Please PLEASE help! Everyone was so amazing helping me fix my first attempt of this problem.

jeron1

Пробовали ли вы инициализировать значения массива паролей перед использованием?

Richard MacCutchan

Это не обязательно, если вы используете strlen, чтобы узнать, сколько символов было введено на самом деле.

Richard MacCutchan

Вы проверяете все 50 позиций символов вашего массива паролей. Что произойдет, если пользователь введет меньше символов? Вам нужно использовать длину введенных данных (из strlen), чтобы узнать, сколько символов нужно проверить.

BooleanBabe

Спасибо, Ричард! Это очень помогло.

5 Ответов

Рейтинг:
41

OriginalGriff

&& это операция AND, поэтому вы говорите: "если a равно 1, А a также 2, А a также 3, то это хороший пароль" - который требует, чтобы "a" имел три разных значения, что глупо! :)

Подумайте о том, как вы будете делать это вручную: вы будете считать количество прописных букв, количество цифр и количество специальных символов. Затем вы проверяли итоговые данные в конце. Так что сделайте то же самое в своем коде:

Установите три целых числа: upperCount, dollarCount, digitCount.
Затем в вашем цикле проверьте каждый символ до трех раз:
Если он прописной, увеличьте верхний регистр.
В противном случае, если это цифра, увеличьте digitCount.
В противном случае, если это знак доллара, увеличьте dollarCoun.
В противном случае ничего не делайте.
После цикла проверьте три счетчика: если все они больше нуля, это хорошо.
В противном случае он слишком слаб.


BooleanBabe

Спасибо за предложение! Я должен быть честен...все еще пытаюсь понять это, но ваше руководство оказало большую помощь. По крайней мере, мой код сейчас компилируется.

OriginalGriff

Всегда пожалуйста!

Рейтинг:
34

Dave Kreskowiak

Как сказал Грифф, ваши тесты в вашем if утверждение может быть истинным только в том случае, если тестируемый символ содержит одновременно 3 различных значения. Это невозможно.

Я дам тебе подсказку. Запустите каждый символ через серию тестов, и если он проходит тест, установите флаг для этого теста. Видишь, к чему это ведет?


BooleanBabe

Я вижу, к чему это ведет. Я думаю, что я борюсь с этим, потому что я еще не понял, как работать через массив...и я думаю, что это ключ к проблеме.

Рейтинг:
22

Rick York

Еще одна вещь - вам не нужно проверять 50 символов строки, если только это не так долго. Ваша петля должна быть примерно такой :

for( i=0; password[i] != 0; ++i )


BooleanBabe

Хорошо...будем иметь это в виду. Спасибо. :)

Рейтинг:
20

Patrice T

Цитата:
Почему моя программа паролей находит символы, которые не существуют в пользовательском вводе?

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
1

KarstenK

Тестирование паролей-это искусство, первичные проверки абсолютно необходимы, но хорошая проверка паролей проверяет также словосочетания и шаблоны, такие как Qwert123.

Сегодня также необходимо требовать специальный символ без цифры или символа (a-z, A-Z), как !#* и так далее.


BooleanBabe

Спасибо за предложение! Очень ценю это!