[C++] cin.getline problem

dr_pepper

Mitglied
Hey, ich verstehe nicht warum es nicht funktioniert :


Code:
#include <iostream>
#include <conio.h>

using namespace std;

int main(void)
{

	char eingabe[22];

	cout << "Bitte gebe das Passwort ein: ";
	
	cin.getline(eingabe, 2);
	
	if (eingabe == "a")
	{
		cout << "right!\n";
	}
	else
	{
		cout << "fail!\n";
	}

	
	getch();


}

ich gebe a ein, und er gibt fail aus :/
 
Hi,

ich würde es so machen.
Mit String arbeiten, damit du mit Variabler Länge arbeiten kannst
anstatt mit char[22] eine feste Zeichenanzahl haben zu müssen,

Bei der char[22] Sache ist das Problem, das du mit dem "a" als Eingabe nur die Stelle eingabe[0] mit a ersetzt...
an den anderen Stellen [1-21] steht irgendwelcher Mist (auch wenn man nix sieht) weil dein Feld nicht initialisiert ist.
Daraufhin geht dein Vergleich auch schief.

Dann würde ich noch mit dem cin Operator direkt arbeiten (>>), ist meiner Meinung nach komfortabler, weil der auch einige Überladungen hat,
was nutzbare Datentypen angeht.

Code:
#include <iostream>
#include <conio.h>

using namespace std;

int main(void)
{

	string eingabe;

	cout << "Bitte gebe das Passwort ein: ";

	cin >> eingabe;

	if (eingabe == "a")
	{
		cout << "right!\n";
	}
	else
	{
		cout << "fail!\n";
	}


	getch();
        return 0;
}

MfG Turri
 
Das Problem ist nicht getline, sondern das char-Array, das lässt solche vergleiche nicht zu.

Du hast 3 Möglichkeiten:
1. Du überprüfst eingabe[0] ob es 'a' ist, ist aber doof, weil du nur einen Buchstaben testen kannst.
2. Du fügst einen std::string ein, setzt ihn mit eingabe gleich, und kannst ihn dann so überprüfen, wie du es gerade mit eingabe machst (eig. die Beste Lösung)
3. Du benutzt die Funktion strcmp(), wenn sie false zurückgibt sind beide strings gleich.
(ansonsten gibt sie die Differenz aus oder sowas) diese Lösung würde ich in einem C-Projekt wählen, aber nicht in einem C++ Projekt

gruß Ryu
 
Im praktischen Einsatz solltest du auf Turris Rat Rücksicht nehmen und in C++ konsequent auf die bereits implementierten Typen und die STL zurückgreifen, und wenn nötig erweitern. C (auch wenn es an sich eine tolle Sprache ist) ist nicht wirklich das, was man als "benutzerfreundliche" Sprache bezeichnen sollte.

C++:
#include <iostream>
#include <conio.h>

using namespace std;

int main(void) {
	char eingabe[22];
	char passwort[] = "a";

	cout << "Bitte gebe das Passwort ein: ";

	cin.getline(eingabe, 2);

	if (!strcmp(eingabe, passwort)) {
		cout << "right!\n";
	} else {
		cout << "fail!\n";
	}

	getch();

	return EXIT_SUCCESS;
}

Der Fehler, den du unten machst ist, dass du zwei Pointer vergleichst, deren Adressen nicht identisch sind (oder es zumindest nie sein sollten). eingabe ist ein Pointer auf die erste Speicheradresse eines von dir reservierten Feldes, und "a" gibt auch lediglich einen const char Pointer zurück. Das Gleichheitszeichen ist also in diesem Fall nicht das gewünschte Mittel zum Zweck. Einen möglichen Weg um zwei Zeichenketten im C-Stil zu vergleichen, kannst du dem obenstehenden Quellcode entnehmen.
 
@maeTimmae
Tschuldingung aber die Lösung ist nicht gerade toll, so hast du immer noch strcmp (eine C-Funktion drinn)

Meiner Meinung nach wäre folgendes die beste Lösung:
(weil reines C++)
C++:
#include <iostream>

using namespace std;

int main()
{

	char eingabe[22];
    string Temp;
    Temp.clear();

	cout << "Bitte gebe das Passwort ein: ";
	
	cin.getline(eingabe, 2);

	Temp = eingabe;

	if (Temp == "a")
	{
		cout << "right!\n";
	}
	else
	{
		cout << "fail!\n";
	}
	
	cin.ignore();
    cin.get();
 
    return 0;

}

übrigens würdest du bei einer Passwort-Abfrage nicht das Passwort im Klartext im Programm speicher, weil das mit nem Hex-Editor auslesbar wäre.
Du würdest höchstens den Hash in dem Programm speichern, und dann vom angenommen Passwort den Hash bilden und vergleichen, aber eigentlich würdes man das Passwort ehr extern in ner Datei speichern, damit es veränderbar ist.
 
Zuletzt bearbeitet von einem Moderator:
@maeTimmae
Tschuldingung aber die Lösung ist nicht gerade toll, so hast du immer noch strcmp (eine C-Funktion drinn)
Dann verstehe ich aber nicht, warum du trotzdem einen C-String zum Einlesen verwendest... einen temporären std::string anzulegen, nur um dessen Überladung von == anstelle einer C-Funktion verwenden zu können, finde ich persönlich ziemlich unnötig. Welchen Vorteil siehst du darin? Ich würde wenn dann konsequenterweise gleich ganz auf die Verwendung von C-Strings verzichten.

Grüße, Matthias
 
Ich stimme dir eigentlich zu, nur dummerweise will getline einen C-String.
und

std::string Temp;
cin.getline(Temp.c_str(), 2);

würde nicht funktionieren, weil der zurückgegebene String const char* ist, und somit kann getline ihn nicht verändern, wenn du mir sagst, wie ich an dieser stelle das char-Array vermeiden kann, werde ich das in Zukunft freudig umsetzen.

Ach ja, und ich ziehe diese Methode strcmp vor, weil ich das a) hübscher finde und ich b) strcmp nicht mag.
 
Zuletzt bearbeitet:
Zurück