So blöd wie´s klingt ... switch wird nicht akzeptiert...
-
silent_max schrieb:
Langsam fange ich an zu schreien...
Ich auch, kannst du lesen? Oo Mit std:: hat das nichts zu tun.
-
zu Zeile 64 in deinem Quelltext:
http://www.cplusplus.com/reference/cstdio/gets/
beim Abschnitt Compatibility lesen.Hat jetzt primär nix mit deinem Problem zu tun. Ist aber, wenn der Nutzer nicht "passende Eingaben" macht, eine Fehlerquelle.
In neuen Quelltexten also
gets(String);
meiden.
-
Hier noch ein paar Anmerkungen:
#include<iostream> //#include<cstring> // raus damit #include<string> using namespace std; bool isLonger(string first, string second) { return first.size() > second.size(); } int main() { cout << "\tErste Schritte mit String\n\n"; cout << "\n"; int number_1; do { cout << "Was wollen Sie tun?\n"; cout << "(1) Texte miteinander vergleichen\n"; cout << "(2) Passwortabfrage\n"; cout << "(3) Nach Buchstaben in einem Text suchen\n"; cout << "(0) Exit\n"; cin >> number_1; switch(number_1) { case 1: { // string erste; cin >> erste; string zweite; cin >> zweite; if(isLonger(erste,zweite)) cout << "Der erste ist länger"; else cout << "Der zweite ist länger"; // wird auch bei gleicher Länge der Strings ausgegeben break; } case 2: { // std::cin.ignore(1); string e; e = "Maximilian*Maximilian"; // warum? // | cout << "\n"; // | cout << "\tPasswortabfrage!\n"; // | cout << "\n"; // | // | do // | { // | cout << "Wie lautet das Passwort?\n"; // v cin >> e; // hier wird e eingelesen (bis zum nächsten Leerzeichen) if(e=="Maximilian*Maximilian") cout << "Richtig eingegeben"; else cout << "Nicht richtig eingegeben!\n"; }while(e!="Maximilian*Maximilian"); break; } case 3: { //std::cin.ignore(2); // siehe unten //char String[10000]; // benutze std::string string String; //char *pString; // raus damit char Buchstabe; cout << "Geben Sie einen String von weniger als 10000 Buchstaben ein!\n"; // mit std::string nicht mehr auf 10000 Buchstaben begrenzt //gets(String); // benutze getline(cin, String); cin.ignore(numeric_limits<streamsize>::max(), '\n'); getline(cin, String); // liest die gesamte Zeile ein cout << "Nach welchem Buchstaben soll gesucht werden?\n "; cin >> Buchstabe; /* pString = strchr(String, Buchstabe); while(pString!=NULL) { cout << "Gefunden an " << pString-String+1 << "\n"; pString = strchr(pString+1, Buchstabe); } */ // C++ Version size_t pos = String.find(Buchstabe); while (pos != string::npos) { cout << "Gefunden an " << pos+1 << "\n"; pos = String.find(Buchstabe, pos+1); } break; } case 0: cout << "Exit durch Abbruch!\n"; break; } }while(number_1!=0); return 0; }
-
cooky451 schrieb:
Du darfst keine Variablendefinitionen im Scope "Überspringen". Führe einen neuen Scope ein:
switch (a) { case 1: { std::string s; // ... } case 2: { } }
Und die Fehlermeldung dazu sollte eigentlich mehr als offensichtlich sein. http://ideone.com/Rd2Tgj
Ok, ok, die geschweiften Klammern bei Dir habe ich jetzt total ignoriert, da ich dachte, es gehe rein um
std::...
.Weil hier habe ich einen Code, wo ich die geschweiften Klammern nicht gemacht habe und trotzdem funktioniert der Code:
#include <iostream> #include <string> using namespace std; int main() { float a; float *pa=&a; float x,y,z; float *px = &x; float *py = &y; float *pz = &z; std::string Text; string *pText = &Text; char Satz[1000]; char *pSatz = &Satz[1000]; int number_1; do { cout << "Was wollen Sie tun?\n"; cout << "(1) Rechnen ueber Pointer\n"; cout << "(2) Speicheradresse eines Strings ausgeben!\n"; cout << "(3) Speicheradresse eines char ausgeben!\n"; cout << "(4) Pointer inkrementieren und dekrementieren!\n"; cout << "(0) Abbruch!\n"; cin >> number_1; switch(number_1) { case 1: int number_2; do { cout << "Welche Operation wollen Sie ausfuehren?\n"; cout << "(1) Addition\n"; cout << "(2) Subtraktion\n"; cout << "(3) Multiplikation\n"; cout << "(4) Division\n"; cout << "(0) Abbruch!\n"; cin >> number_2; switch(number_2) { case 1: cout << "Addition!\n"; cout << "Geben Sie dazu zwei Zahlen ein!\n"; cin >> *px >> *py; *pz = *px + *py; cout << *px << " + " << *py << " = " << *pz << "\n"; cout << "Speicheradresse von x: " << &x << "\n"; cout << "Speicheradresse von y: " << &y << "\n"; cout << "Speicheradresse von z: " << &z << "\n"; break; case 2: cout << "Subtraktion!\n"; cout << "Geben Sie dazu zwei Zahlen ein!\n"; cin >> *px >> *py; *pz = *px - *py; cout << *px << " - " << *py << " = " << *pz << "\n"; cout << "Speicheradresse von x: " << &x << "\n"; cout << "Speicheradresse von y: " << &y << "\n"; cout << "Speicheradresse von z: " << &z << "\n"; break; case 3: cout << "Multiplikation!\n"; cout << "Geben Sie dazu zwei Zahlen ein!\n"; cin >> *px >> *py; *pz = *px * *py; cout << *px << " * " << *py << " = " << *pz << "\n"; cout << "Speicheradresse von x: " << &x << "\n"; cout << "Speicheradresse von y: " << &y << "\n"; cout << "Speicheradresse von z: " << &z << "\n"; break; case 4: cout << "Division!\n"; cout << "Geben Sie dazu zwei Zahlen ein!\n"; cin >> *px >> *py; *pz = *px / *py; cout << *px << " / " << *py << " = " << *pz << "\n"; cout << "Speicheradresse von x: " << &x << "\n"; cout << "Speicheradresse von y: " << &y << "\n"; cout << "Speicheradresse von z: " << &z << "\n"; break; case 0: cout << "Exit durch Abbruch!\n"; break; } }while(number_2!=0); break; case 2: std::cin.ignore(1); cout << "Geben Sie einen Text ein!\n"; getline(cin, Text); cout << "\n"; cout << "Das haben Sie eingegeben: \n"; cout << Text << "\n"; cout << "Speicheradresse des Textes:" << &Text << "\n"; cout << "\n"; break; case 3: std::cin.ignore(2); cout << "Geben Sie einen Satz ein!\n"; gets(Satz); cout << "\n"; cout << "Diesen Satz haben Sie eingegeben: \n"; cout << Satz << "\n"; cout << "Speicheradresse des Satzes: " << &Satz << "\n"; break; case 4: cout << "Geben Sie eine Zahl ein!\n"; cin >> a; cout << "\n"; cout << "Das haben Sie eingegeben: " << a << "\n"; cout << "\n"; *pa+=1; cout << "Inkrementiert: " << *pa << "\n"; cout << "\n"; *pa-=2; cout << "Dekrementiert: " << *pa << "\n"; cout << "\n"; break; case 0: cout << "Exit durch Abbruch!\n"; cout << "\n"; break; } }while(number_1!=0); return 0; }
Wo ist denn der Unterschied, dass ich beim momentan Code die geschweiften Klammern setzen muss und beim 2ten Code nicht??
Gruß
-
Aufgabe 1: Lesen lernen.
-
Beim Sprung in einen der case-Zweige wird eine Initialisierung übersprungen. (Das würde die Fehlermeldung auch aussagen, wenn sie nicht von Idioten übersetzt worden wäre, wie gesagt.)
Beispiel:
switch (x) { case 1: int y = 42; case 2: z = y; // was passiert? ...
Antwort: Nichts passiert, sowas ist nicht erlaubt. Das ist sogar nichtmal dann erlaubt, wenn y in den anderen case-Zweigen überhaupt nicht benutzt wird. Also musst du den Gültigkeitsbereich von y beschränken, indem du den case-Zweig in einen eigenen Block packst, wie bei cooky gesehen.
In deinem zweiten Beispiel gibt es keine übersprungene Initialisierung, deshalb gibt es auch kein Problem.
-
Die Fehlermeldung besagt, dass durch das "break" in Deinem switch-case Variablendefinitionen in nachfolgenden case-Anweisungen übersprungen werden, was nicht erlaubt ist. In dem zweiten Beispiel, dass Du angegeben hast, werden in cases keine Variablen definiert. Deswegen funktioniert das.
@cooky: Arbeite mal an Deinen Umgangsformen. Deine Erläuterungen sind für einen Anfänger nicht zu verstehen. Aufgabe 1: Netiquette lernen, Aufgabe 2: Zielgruppengerechte Kommunikation lernen.
-
case_breaker schrieb:
Die Fehlermeldung besagt, dass durch das "break" in Deinem switch-case Variablendefinitionen in nachfolgenden case-Anweisungen übersprungen werden, was nicht erlaubt ist.
Mit dem break hat das nichts zu tun.
-
cooky451 schrieb:
Du darfst keine Variablendefinitionen im Scope "Überspringen". Führe einen neuen Scope ein:
Darf ich an der Stelle fragen, was Du mit "Scope" meinst??
Ich habe zwar gegoogelt, habe aber Sachen wie http://ladedu.com/cpp/kapitel8_der_scope_operator bekommen.
Gruß
-
Wenn ich nach "C++ scope" suche kommen mindestens 500 gute Ergebnise, die ersten sind
http://msdn.microsoft.com/en-us/library/b7kfh662(v=vs.80).aspx
http://www.drdobbs.com/cpp/scope-regions-in-c/240002006
Kurz: Scope = Gültigkeitsbereich = { /* das hier */ }void foo() { // ein scope { // noch einer { // und noch einer! } } }
-
Ja ok...
Dann habe ich erneut etwas dazu gelernt...