2015-10-27 2 views
-1

Я пытаюсь написать программу на C++, которая проверяет пароль, для которого требуется одна буква верхнего регистра, одна строчная буква и цифра с использованием функций.Проверка пароля с C++ и предоставление конкретных ошибок

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

#include<iostream> 
#include<string> 
#include<cctype> 

using namespace std; 

int validate(string); 
string find(int); 

int main() 
{ 
    string pw; 
    int val; 
    string result; 


    do{ 
      cout << "Enter password: " << endl; 
      cin >> pw; 
      val = validate(pw); 
      cout << find(val) << endl; 

     } while (val != 0); 


} 
//VALIDATES PASSWORD 
int validate(string pw) 
{ 
    int valid = 0; 
    char c; 
    int length = pw.length(); 
    bool digit = false; 
    bool upper = false; 
    bool lower = false; 

    int i = 0; 

    if (pw.length() < 6) 
     valid = 1; 

    while (i < pw.length()) 
    { 
     c = pw[i]; 
     i++; 

     if (isdigit(c)) 
     { 
      digit = true; 
      valid++; 
     } 
     if (isupper(c)) 
     { 
      upper = true; 
      valid++; 
     } 
     if (islower(c)) 
     { 
      lower = true; 
      valid++; 
     } 

     //Valid input 
     if (length >= 6 && upper && lower && digit) 
      valid = 0; 

} 

return valid; 


} 
//RETURNS STRING WITH PROBLEM 
string find(int valid) 
{ 

    string result; 

    if (valid == 0) 
    { 
     result = "Valid Password "; 
    } 
    else 
    { 
     result = "Invalid Password: "; 

     if (valid == 1) 
      result = result + " Too short "; 
     else if (valid == 2) 
      result = result + " too short, needs a digit, and an uppercase letter"; 
     else if (valid == 3) 
      result = result + " too short, needs a digit, and a lowercase letter"; 
     else if (valid == 4) 
      result = result + " too short, and needs an uppercase letter"; 
     else if (valid == 5) 
      result = result + " too short, and needs a lowercase letter"; 
     else if (valid == 6) 
      result = result + " too short, needs a digit"; 


     else if (valid == 7) 
      result = result + " Needs a didgit "; 
     else if (valid == 8) 
      result = result + " Needs digit and uppercase letter "; 
     else if (valid == 9) 
      result = result + " Needs digit and lowercase letter"; 


     else if (valid == 10) 
      result = result + " Needs an uppercase letter "; 
     else if (valid == 11) 
      result = result + " Needs uppercase and lowercase letter"; 

     else if (valid == 12) 
      result = result + " Needs a lowercase letter"; 

    } 

    return result; 
} 
+0

Google немного о stringstreams;) –

+0

Пожалуйста, попробуйте создать минимальный, полный, проверяемый пример : http://stackoverflow.com/help/mcve – Florian

+0

С уважением, –

ответ

0

Я думаю, что вы путаете количество символов (действительный) и тип ошибки -

else if (valid == 9) 
    result = result + " Needs digit and lowercase letter"; 

может быть получен из 123456abc

Как valid == 9 действительно только подсчитывать символы в задавать. Раздельный подсчет и используются ли классы символов.

0

Лучше использовать некоторые флаги (переменные bool) вместо одного числа. Если вы хотите использовать один номер, вы должны создать 2^(вещи для проверки) ситуации , используя этот номер. Здесь требуется 2^4 = 16 ситуаций.

Один из самых простых способов смешивания флагов в один ряде заключается в следующем: п-я цифра = п-й флаг

, например, использовать этот заказ (длину, нижние, верхние, цифры). Так,

to set length validity, add 1000 to number; 
to set lower validity, add 100 to number; 
to set upper validity, add 10 to number; 
to set digit validity, add 1 to number; 

Теперь

((number)%10 == 1) means digit validity 
((number/10)%10 == 1) means upper validity 
((number/100)%10 == 1) means lower validity 
((number/1000)%10 == 1) means length validity 

После кода использует отдельные флаги:

#include<iostream> 
#include<string> 

using namespace std; 

class PasswordStatus 
{ 
    bool len, low, up, dig; 
    //============ 
public: 
    PasswordStatus() 
    { 
     len = low = up = dig = false; 
    } 
    //----------- 
    void ShowStatus() 
    { 
     cout << endl << "Password Status:" << endl; 
     cout << "Length : " << (len ? "OK" : "Too Short") << endl; 
     cout << "Contains Lower Case : " << (low ? "Yes" : "No") << endl; 
     cout << "Contains Upper Case : " << (up ? "Yes" : "No") << endl; 
     cout << "Contains Digit : " << (dig ? "Yes" : "No") << endl; 
    } 
    //----------- 
    void checkValidity(string pass) 
    { 
     int sLen = pass.length(); 

     len = (sLen >= 6); 

     for(int i = 0; i<sLen; i++) 
     { 
      char c = pass[i]; 

      if(!low && islower(c)) {low = true; continue;} 
      if(!up && isupper(c)) {up = true; continue;} 
      if(!dig && isdigit(c)) {dig = true; continue;} 
     } 
    } 
    //----------- 
    bool IsTotalyValid() 
    { 
     return low && up && dig && len; 
    } 
}; 
//==================================================================== 
int main() 
{ 
    PasswordStatus ps; 
    string pw; 

    do 
    { 
     cout << endl << "Enter password: " << endl; 

     cin >> pw; 

     ps.checkValidity(pw); 
     ps.ShowStatus(); 
    } while (!ps.IsTotalyValid()); 

    cout << "Valid Password : " << pw; 
    return 0; 
} 
+0

Я бы документировал этот код и объяснил, что вы изменили и почему. Чистые ответы на код, как правило, приводят к [Cargo Cult] (https://en.wikipedia.org/wiki/Cargo_cult_programming) поклонению, а не обучению. – user4581301