Eingabe überprüfung

creed93

Grünschnabel
Hallo,

Ich will ein Programm schreiben welches die Eingabe auf Mindestanforderung überprüft, sprich die Eingabe soll:
-mindestens 8 Zeichen lang sein
-Zeichen von 'a' bis 'z', 'A' bis 'Z' und Sonderzeichen wie '!' und '?' enthalten
- Groß und Kleinbuchstaben enthalten.

Zurzeit sieht mein Programm so aus. Habe versucht die 8 Zeichen hinzukriegen. Funktioniert auch in etwa. Jedoch fallen mir zu den anderen zwei Bedingungen keine Ansätze ein.
Hier ist mein Code.
C++:
/*
Name: Passwortprüfer
Beschreibung: Erstelle ein Programm, welches ein eingegebenes Passwort auf folgende Mindestanforderungen prüft:
• Länge >= 8 Zeichen
• Erlaubte Zeichen: 'a' bis 'z', 'A' bis 'Z', '!', '?', '#', '<', '>', '/', '%', '(', ')', '[', ']'
• enthält Groß- und Kleinbuchstaben sowie Sonderzeichen
*/
#include<iostream>
using namespace std;

void Laenge(char* Passwort);
////void Zeichen();
void GrosKlein(char*Passwort);

int main ()
{   
    const int Anzahl = 10;
    char Passwort[Anzahl] = {};
   
        cout << "Bitte geben Sie ihr Passwort ein: " << endl;
       
   
            Laenge(Passwort);
            GrosKlein(Passwort);
//            Zeichen();*/

    system("pause");
    return 0;
}
////Länge >= 8 Zeichen
void Laenge(char *Passwort)
{
    //char Passwort; // test = t,e,s,t,0,0,0
    bool laenge = false;
    cin >> Passwort;
    int counter = 0;
    for (int i = 0; i < 8; i++)
    {
        if (Passwort[i] == 0)
        {
            cout <<"Passwort ist zu kurz" << endl;
            counter++;
            laenge = false;


        }
    }
    if (counter == 0)
        {
            cout << "Passwort laenge korrekt" << endl;
            laenge = true;
        }       
}


//• enthält Groß - und Kleinbuchstaben sowie Sonderzeichen
void GrosKlein(char*Passwort)
{
    bool laenge = false;
    int counter = 0;
    for (int i = 0; i < 8; i++)
    {
        if (Passwort[i] >= 'a' || Passwort[i] <= 'z' || Passwort[i] >= 'A' || Passwort[i] <='Z'    )
        {
            cout << "Passwort erfullt nicht die Anforderung" << endl;
            counter++;
            laenge = false;
        }
    }
    if (counter == 0)
    {
        cout << "Passwort erfuellt die Anforderung "<< endl;
        laenge = true;
    }



}

////• Erlaubte Zeichen : 'a' bis 'z', 'A' bis 'Z', '!', '?', '#', '<', '>', '/', '%', '(', ')', '[', ']'
//void Zeichen()
//{}


Schönen Abend
 
Hi und WIllkommen bei tutorials.de,

ein paar allgemeine Sachen zum derzeitigen Code:

a)
C++:
const int Anzahl = 10;
char Passwort[Anzahl] = {};
Damit gibt es zwei große Probleme: Die Aufgabe verlangt zwar, dass das PW min. 8 Zeichen haben muss, gibt aber keine Maximallänge vor: Deine Variable hat aber max 9 Zeichen halten (bzw. 10 mit der \0 am Ende). Und viel schlimmer als das, wenn der Benutzer beim Einlesen mit cin dann doch mehr als 9 Zeichen eingibt kannst du gar nichts dagegen machen, dass dabei was kaputt geht. zB. Absturz vom Programm, eine unerwartete Änderung anderer Variablen, oder Ähnliches.
Lösung: Verwendei die string - Klasse aus #include<string> (genauer gesagt std::string). Es kann mit (fast) beliebigen Längen umgehen, und Sachen wie der Einzelcharzugriff mit [nummer] funktionieren auch damit unverändert weiter.
C++:
string Passwort;
...
void Laenge(string Passwort);
...
Eine korrekte Lösung mit char* wäre schon möglich, aber vor allem beim Einlesen viel umständlicher
(und dann gibt es noch Sachen wie const-Correcntess und und und).

b)
Das cin >> Passwort; hat auch zwei Probleme:
Erstens soltle es jetzt gleich nach "Bitte geben Sie ihr Passwort ein: " gemacht werden, nicht erst in einer Funktion. Variablen werden beim Übergeben zu Funktionen kopiert, du würdest nur die Kopie ändern (und die anderen zwei FUnktionsaufrufe kopieren dann aber wieder das leere Original). Beim alten char-Array wäre das zwar auch in der Funktion möglich gewesen (weil Pointer), aber zumindest kein guter Stil.
Zweitens arbeitet "cin>>etwas" prinzipiell so, dass nicht nur die Entertaste die Eingabe abschließt, sondern auch (dann) alles nach dem ersten Leerzeichen ignoriert wird. Beim Passwort "abc" kein Problem, bei "a b c" bekommt man nur das a.
Einfache Lösung: Ersetzen mit getline(std::cin, Passwort);

c)
Du machst in den Schleifen immer das ganze char-Array (außer den letzten zwei Stellen?) durch. Bei der alten Lösung war das zwar nicht falsch, aber unnötig, man hätte mit strlen(Passwort); die aktuelle Länge abfragen können (und damit die Längenprüffunktion auch viel einfacher machen können). Mit der jetzt beliebig Langen EIngabe vom Benutzer (bei string) könnte die erste Eingabe ja länger sein, nur die ersten paar Zeichen anschauen hilft nicht. Ähnlich wie strlen gibt es dazu Passwort.length()

Der bisherige Teil könnte dann so ausschauen:
C++:
#include<iostream>
#include<string>
using namespace std;

void Laenge(char* Passwort);
////void Zeichen();
void GrosKlein(char*Passwort);

int main ()
{  
	string Passwort;

	cout << "Bitte geben Sie ihr Passwort ein: " << endl;
	getline(cin, Passwort);

	Laenge(Passwort);
	GrossKlein(Passwort);
	//Zeichen();*/

	system("pause");
	return 0;
}

////Länge >= 8 Zeichen
void Laenge(string Passwort)
{
	if(Passwort.length() >= 8)
		cout << "Passwortlaenge korrekt" << endl;
	else
		cout << "Passwort ist zu kurz" << endl;
}

Zu Grossklein:
Neben den bisher genannten Sachen (zB. for(int i = 0; i < Passwort.lenght(); i++)) ist das Hauptproblem die Bedingung:
C++:
if (Passwort[i] >= 'a' || Passwort[i] <= 'z' || Passwort[i] >= 'A' || Passwort[i] <='Z'    )
Wenn "mindestens eins" der 4 Teile erfüllt ist dist bei dir das PW ungültig. Wenn man sich die ASCII-Tabelle anschaut ist das immer so.
Wie wäre zB.
C++:
if(Passwort[i] < 'a' && Passwort[i] > 'z' && Passwort[i] < 'A' && Passwort[i] > 'Z')
?

Ein paar weiterführende Stichworte:
break, size_t
 
Zuletzt bearbeitet:
Erst einmal vielen Dank für Ihre so umfangreiche Antwort :)
Jedoch habe ich vergessen das strings nicht erlaubt sind :))

Ich habe mein Programm überarbeitet. Mein Problem liegt nun darin das ich nicht aus der while Schleife in der main raus komme.
Es wird jedesmal " Passwort erfullt die Bedingung" nicht ausgegeben.

Code:
/*
/*
Name: Passwortprüfer
Beschreibung: Erstelle ein Programm, welches ein eingegebenes Passwort auf folgende Mindestanforderungen prüft:
• Länge >= 8 Zeichen
• Erlaubte Zeichen: 'a' bis 'z', 'A' bis 'Z', '!', '?', '#', '<', '>', '/', '%', '(', ')', '[', ']'
• enthält Groß- und Kleinbuchstaben sowie Sonderzeichen
*/
#include<iostream>
using namespace std;

bool Eingabe(char* Passwort);
bool GrosKlein(char*Passwort);
bool Laenge(char*Passwort);

int main()
{
  const int Anzahl = 8;
  char Passwort[Anzahl] = {};

  cout << "Bitte geben Sie ihr Passwort ein: " << endl;

  while(Eingabe(Passwort) == false)
  {
  cout << "Passwort lautet "<< Passwort << endl;
  cout << "Passwortanforderung nicht erfuellt! Bitte Eingabe wiederholen! " << endl;
  }
  cout << " Passwortanforderung erfuellt! " << endl;

  //system("pause");
  return 0;
}
bool Eingabe(char*Passwort)
{
  if (Laenge(Passwort) == true && GrosKlein(Passwort) == true)
  {
  cout << "Eingabe ist in ordnung" << endl;
  return true;
  }
  else
  {

  return false;
  }
}
bool Laenge(char *Passwort)
{
  bool kurz = false;
  cin >> Passwort;
  int counter = 0;
  for (int i = 0; i < 8; i++)
  {
  if (Passwort[i] == 0)
  {
  kurz = true;
  counter++;
  }
  }
  if (counter == 0)
  {
  kurz = false;
  }

  if (kurz == false)
  {
  cout << "Laenge ist in ordnung" << endl;
  return true;
  }
  else
  {
  cout << "Passwort ist zu kurz" << endl;
  return false;
  }
}

//• enthält Groß - und Kleinbuchstaben sowie Sonderzeichen
bool GrosKlein(char*Passwort)
{
  bool counterKleinzeichen = false;
  bool counterGroszeichen = false;
  bool counterSonderzeichen = false;
  bool zahl;
  int counter = 0;
  for (int i = 0; i < 8; i++)
  {
  if (Passwort[i] >= 'a' && Passwort[i] <= 'z')
  {
  counterKleinzeichen = true;
  cout << "counterKleinzeichen == true" << endl;

  }
  if (Passwort[i] >= 'A' && Passwort[i] <= 'Z')
  {
  counterGroszeichen = true;
  cout << "counterGroszeichen == true" << endl;
  }
  if (Passwort[i] == '!' || Passwort[i] == '?' || Passwort[i] == '#' || Passwort[i] == '<' ||
  Passwort[i] == '>' || Passwort[i] == '/' || Passwort[i] == '%' || Passwort[i] == '(' ||
  Passwort[i] == ')' || Passwort[i] == '[' || Passwort[i] == ']')
  {
  counterSonderzeichen = true;
  cout << "counterSonderzeichen == true" << endl;
  }
  if (Passwort[i] >= '0' && Passwort[i] < '9'){
  zahl = true;
  cout << "Zahl eingegeben!!!" << endl;
  }
  if (counterKleinzeichen == true && counterGroszeichen == true && counterSonderzeichen == true && zahl == false)
  {
  cout << "GroßKlein und Sonderz sind in ordnung" << endl;
  return true;
  }
  else
  {
  cout << "Passwort enthält kein Gros-/Klein oder Sonderzeichen! " << endl;
  return false;
  }
  }
}
 
Zurück