неожиданный бесконечный l oop в c ++ - PullRequest
0 голосов
/ 04 апреля 2020

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

#include <iostream>
#include <string>
#include <cstring>
#include <conio.h>
#include <stdio.h>
using namespace std;
#define size 40
int main(){
    bool flag = true;
    while (flag){
        bool flagS = false, flagN = false; int count = 0;
        char password[size] = { 0 };
        cout << "Type your Password .....\n Note :: Must be more than 8 characters including at least one number and one special character...\n";
        cin.get(password, size);
        count = strlen(password);
        for (int z = 0; z < count; z++){
            if (password[z] >= 48 && password[z] <= 57)
                flagN = 1;
            if ((password[z] >= 33 && password[z] <= 47) || (password[z] >= 58 && password[z] <= 64))
                flagS = 1;
        }

        if ((flagS == 1) && (flagN == 1) && (count >= 8))
        {
            cout << "Valide Password ...\nCongrats!! ..you created a NEW account.." << endl;
            flag = false;
        }
        else
        {
            cout << "invalide password..\nPlease try again..\n";
            flag = true;
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

std::istream::get не удаляет перевод строки из потока. Это означает, что следующий вызов std::istream::get немедленно найдет новую строку и ничего не прочитает в буфер, установит бит ошибки и вернется. Поскольку поток в настоящее время находится в состоянии сбоя, все последующие чтения мгновенно терпят неудачу. Вы можете cin.ignore() перевод строки, но более прямым подходом является использование std::istream::getline, потому что он удаляет перевод строки для вас.

Всегда проверяйте состояние потока после транзакции ввода-вывода, чтобы сделать уверен, что это удалось.

Примечание:

Предпочитают использовать std::string и std::getline для необработанных массивов символов и функций, которые их используют. std::istream::get и std::istream::getline оба помечают поток как сбойный, если предоставленный буфер слишком мал. Размер string, предоставленный для std::getline, будет изменен, так что, если у вас осталось динамическое хранилище c, переполнения буфера и ошибки, возникшие для их предотвращения, не являются проблемой. Если система не может выделить буфер достаточного размера для string, возникает исключение, чтобы вы знали о проблеме.

Предпочитают использовать буквы, например 'A', для необработанного кода ASCII. С одной стороны, намерение 'A" сразу узнаваемо даже самым сырым программистам, и всегда есть вероятность, что реализация не использует ASCII в качестве кодировки по умолчанию.

2 голосов
/ 04 апреля 2020

Вы должны написать cin внутри while l oop. И это решит вашу проблему:

#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
#define size 40
int main(){
    bool flag = true;
    bool flagS = false, flagN = false; int count = 0;
    char password[size] = { 0 };

    cout << "Type your Password .....\n Note :: Must be more than 8 characters including at least one number and one special character...\n";

    while (cin >> password && flag){

        count = strlen(password);
        for (int z = 0; z < count; z++){
            if (password[z] >= 48 && password[z] <= 57)
                flagN = true;
            if ((password[z] >= 33 && password[z] <= 47) || (password[z] >= 58 && password[z] <= 64))
                flagS = true;
        }

        if ((flagS) && (flagN) && (count >= 8))
        {
            cout << "Valide Password ...\nCongrats!! ..you created a NEW account.." << endl;
            flag = false;
        }
        else
        {
            cout << "invalide password..\nPlease try again..\n" << "Type your Password .....\n Note :: Must be more than 8 characters including at least one number and one special character...\n";;
            flag = true;
        }
    }
}
...