Wo liegt der Fehler?! Wer kann mir helfen?
-
Achso, anstatt Sytem Pause würde ich eine wait-Funktion verwenden
#include <cstdlib> #include <iostream> using namespace std; void wait () { cin.clear (); cin.ignore (cin.rdbuf ()->in_avail ()); cin.get (); } int main() { char passwort[] = "bla"; cout << "Hallo!" << endl; cout << endl; cout << "Bitte geben sie Ihr Passwort ein: "; cin >> passwort; if (passwort == "bla") cout << "Okay"; else cout << "Falsches PW" << endl; wait (); return 0; }
-
BitWax schrieb:
Jepp, mach " anstatt '. Die einfachen sind für einzelne Zeichen und die doppelten für Arrays.
EDIT: Außerdem kannst du ein einzelnen Char nicht mit 3 Chars füllen! Mache
char text[3] = "bla";AH!!!! Jetzt weiß ich was du meinst!^^
Klingt gut! Danke!
.filmor schrieb:
Das ist dann aber immernoch grober Unfug. Benutz .
Ich bin ja wie gesagt noch nicht so lang dabei... was stimmt daran nicht bzw was ist daran Unfug?!
std::stringMeinst du damit ich soll das PW als einen String angeben?!
________________________________________________________________________________@BitWax:
Was isn ne wait-schleife und was bringt die?!
-
Je öfter ich deinen Code angucke, um so mehr finde ich...
Also: Es macht wenig Sinn, die Variable passwort gleich zu füllen, da du sie ja eh durch Benutzereingabe überschreiben lässt. Demnach:#include <cstdlib> #include <iostream> . . . int main() { char passwort[25]; . . . return 0; }EDIT: das ist keine Schleife, sondern eine Funktion. Die Funktion macht das gleiche wie system ("Pause").
-
BitWax schrieb:
Je öfter ich deinen Code angucke, um so mehr finde ich...
Dachte gar nicht das ich sooo schlecht bin!

Also: Es macht wenig Sinn, die Variable passwort gleich zu füllen, da du sie ja eh durch Benutzereingabe überschreiben lässt. Demnach:
#include <cstdlib> #include <iostream> . . . int main() { char passwort[25]; . . . return 0; }

Aber wenn ich das Pw festlege, so kann das doch im Programm nicht mehr überschrieben werden, oder?
EDIT: das ist keine Schleife, sondern eine Funktion. Die Funktion macht das gleiche wie system ("Pause").
Funktion - meine ich doch!^^

-
Crew06ZW schrieb:

Aber wenn ich das Pw festlege, so kann das doch im Programm nicht mehr überschrieben werden, oder?
Es geht ja nicht darum, was in der Variable steht, weil du in deiner if-Konstruktion einfach eine Variable mit einem Wert vergleichst. Dieser Wert ist konstant, kann also nicht verändert werden. Die Variable jedoch, ist, vorausgesetzt du definierst sie nicht konstant, nicht konstant. Das heißt deine Variable (i.d.F. "passwort") ist veränderbar aber dein Wert (i.d.F. "bla") nicht.
-
Naja gut!
Ich versuchs mal mit den Arrays!
THX!

-
Crew06ZW schrieb:
Ich bin ja wie gesagt noch nicht so lang dabei... was stimmt daran nicht bzw was ist daran Unfug?!
Alles Relevante

Ich gehe jetzt mal von dem zu Anfang gezeigten Code aus:
char password = 'bla';Hier hast du bereits zweieinhalb Fehler drin. Zu erst einmal ist wie Bitwax schon sagte, ein Stringliteral in Anführungszeichen zu setzen. Dann ist char der Datentyp für einen einzelnen Buchstaben. Du kannst in einer solchen Variable keinen String speichern. Deshalb wird in C die Konvention verwendet, dass man Zeichenketten in Form eines Zeigers (char*) auf das erste Element übergibt. Das Ende der Zeichenkette wird dann mit einem Nullbyte ('\0', als Integer eine einfache 0) angegeben. Ebendeshalb müsstest du mindestens "char* password" schreiben.
Stringliterale liegen in nicht veränderbaren Speicher. Deswegen haben sie den Datentype "const char*" statt char*. Das ist der halbe Fehler, denn aus Gründen der Abwärtskompatibilität kann man Stringliterale trotzdem einem char* zuweisen.
Falls in diese Variable aber das Passwort hinein sollte, dann musst du ein Array verwenden (s. BitWax'-Post).Crew06ZW schrieb:
if(passwort == 'bla' )
Das ist eine verzwickte Stelle. Würdest du hier statt std::string (s.u.) einen C-String (also const char*) benutzen kann dieser Vergleich unbeanstandet durch den Compiler gehen (mit syntaktisch korrektem Literal natürlich), wird aber nicht das tun, was du wolltest (der Fehler ist auch bei BitWax noch drin ;)). Du vergleichst hier höchstens die Werte der Zeiger, also Speicheradressen. Du kannst zwar mit strcmp auch C-Strings vergleichen, aber besser gehts mit:
std::stringCrew06ZW schrieb:
Meinst du damit ich soll das PW als einen String angeben?!
Das tust du bereits. Ich meine damit, dass du die C++-Klasse std::string verwenden sollst. Denn mit dieser tut der Vergleich auch was er soll.
Hast du kein Lehrbuch oder Tutorial?
-
Zum Vergleichen von Strings nimmt man strcmp und nicht ==.
-
Okay, okay!
Dank eurer Hilfen sind meine Kompilerfehlermeldungen stark gesunken, aber es läuft immer noch net!
Das mit den Arrays hab ich hinbekommen aber das mit den strings nun versteh ich nicht!

Was soll ich nun mit std::string machen?!
Mein Quellcode sieht bisher so aus:
#include <cstdlib> #include <iostream> using namespace std; int main() { char passwort[8] = "bla"; cout << "Hallo!" << endl; cout << endl; cout << "Bitte geben sie Ihr Passwort ein: "; cin >> passwort; if(passwort == "bla" ) { cout << "Loginbereich"; } else { cout << "Falsches Passwort!" << endl; } system("PAUSE"); return 0; }Nun?! Was muss ich nun mit den String machen?
-
Also: includiere den Header "string". Anschließend statt "char passwort[8];" schreibe "string passwort". Und dann in der if-Anweisung nicht 'passwort == "bla"' sondern "strcmp (passwort, "bla") == 0"
-
@BitWax: nicht ganz...
#include <cstdlib> #include <iostream> #include <string> // für std::string using namespace std; int main() { std::string passwort; // hier std::string verwenden! cout << "Hallo!" << endl; cout << endl; cout << "Bitte geben sie Ihr Passwort ein: "; cin >> passwort; if(passwort == "bla" ) // weil du std::string benutzt funktioniert der Vergleich { cout << "Loginbereich"; } else { cout << "Falsches Passwort!" << endl; } system("PAUSE"); return 0; }
-
BitWax schrieb:
Und dann in der if-Anweisung nicht 'passwort == "bla"' sondern "strcmp (passwort, "bla") == 0"
Die std::string-Klasse bringt aber einen schönen Vergleichsoperator mit sich

-
Ich hab mal ne Frage zu dem Code:
#include <cstdlib> #include <iostream> using namespace std; int main() { char passwort[8] = "bla"; /* Was bringt die Zuweisung hier? * Mit cin>>passwort "überschreibt" * man passwort doch so wie so nochmal?! * Oder? */ cout << "Hallo!" << endl; cout << endl; cout << "Bitte geben sie Ihr Passwort ein: "; cin >> passwort; if(passwort == "bla" ) // Die prüfung findet doch so wie so hier statt?! { cout << "Loginbereich"; } else { cout << "Falsches Passwort!" << endl; } system("PAUSE"); return 0; }
-
Die Zuweisung bringt gar nichts. Ich habe schon versucht ihm das zu erklären, aber naja.
@ die anderen: JAJA IST JA GUT

Und std::string ist sinnlos, da er using namespace std; gemacht hat.
-
So... okay!
Ich bin glaub ich kurz davor das Programm zum laufen zu bekommen!
So siehts bis jetzt aus:
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string passwort[25]; passwort[25] = "bla"; cout << "Hallo!" << endl; cout << endl; cout << "Bitte geben sie Ihr Passwort ein: "; cin >> passwort[25]; if(strcmp (passwort, "bla") == 0 ) { cout << "Moin!"; } else { cout << "Falsches Passwort!" << endl; } system("PAUSE"); return 0; }Jetzt gibt es nur noch ein Problem... meinKompiler heult bei dieser stelle rum:
if(strcmp (passwort, "bla") == 0 )Meldung:
cannot convert `std::string*' to `const char*' for argument `1' to `intKompiler: DevC++
Was ist falsch?!
-
Mir scheint es, du hast die letzten Posts nicht 100%ig verstanden. Also erstmal ist ein string bereits eine Art char-Array. Dann wurde hier auch schon gesagt, dass man strings auch mit == vergleichen kann. Außerdem bringt es dir nichts, die Variable "passwort" mit einem Wert zu füllen, da "passwort" eh vom User wieder überschrieben wird. Alles in allem:
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string passwort; cout << "Hallo!" << endl; cout << endl; cout << "Bitte geben sie Ihr Passwort ein: "; cin >> passwort; if (passwort == "bla") { cout << "Moin!"; } else { cout << "Falsches Passwort!" << endl; } system("PAUSE"); return 0; }EDIT: Such dir mal im I-Net ein paar Tutorials über C++ raus.
-
BitWax hat einen Fehler gemacht. Er sagte, dass du strcmp verwenden sollst. Das wurde aber von mir und The-Kenny bereits korrigiert. Also
nochmal lesen.BitWax schrieb:
Und std::string ist sinnlos, da er using namespace std; gemacht hat.
Ich nutze fast nie using namespace std. Deshalb schreibe ich immer std::string

Gruß
Don06
-
Also erstmal: Ein Fehler wenn man mit string arbeitet. Aber ja, ein Fehler.
Don06 schrieb:
BitWax schrieb:
Und std::string ist sinnlos, da er using namespace std; gemacht hat.
Ich nutze fast nie using namespace std. Deshalb schreibe ich immer std::string

hmmm, mir ist das zuviel, unnötige Schreibarbeit (wobei ich sowas aus der WinAPI gewohnt bin)
-
Ich bezog mich auf diesen Beitrag:
BitWax schrieb:
Also: includiere den Header "string". Anschließend statt "char passwort[8];" schreibe "string passwort". Und dann in der if-Anweisung nicht 'passwort == "bla"' sondern "strcmp (passwort, "bla") == 0"
Du hast nur vor mir gepostet

Gruß
Don06
-
Ja, dachte ich mir schon. Aber irgendwie haben wir beide den Thread gerade übernommen (?). Oder er ist so fertig von dem Zeug das er sich...nun...schlafen gelegt hat
