C: "error: switch quantity not an integer"??
-
Hallo ich habe hier ein kleines Programm:
int main() { char eingabe[]; while(1){ printf("Personenverwaltung:\n"); printf("Ihre Eingabe:\n"); printf("S: Personen Suchen\n"); printf("A: Personen anzeigen\n"); printf("H: Personen Hinzufügen\n"); printf("E: Personen Entfernen\n"); printf("B: Programm beenden\n"); scanf("%c", &eingabe); //Zeile 29 switch(eingabe){ //Zeile 31 case 'S': break; case 'A': break; case 'H': break; case 'E': break; case 'B': return 0; break; default: printf("Fehler: ungueltige Eingabe"); break; } } return 0; }Und wenn ich das ganze Compilieren möchte bekomme ich diesen Fehler:
main.c:31: error: switch quantity not an integer
und diese Warnung:
main.c:29: warning: char format, different type arg (arg 2)
-
s/char eingabe[];/char eingabe;/
-
Was ich seltsam finde ist, wenn ich das Programm starte, sehe ich das:
Personenverwaltung: Ihre Eingabe: S: Personen Suchen A: Personen anzeigen H: Personen Hinzuf³gen E: Personen Entfernen B: Programm beendenWas ja auch so sein soll, wenn ich jetzt aber etwas Eingebe, sehe ich das:
Personenverwaltung: Ihre Eingabe: S: Personen Suchen A: Personen anzeigen H: Personen Hinzuf³gen E: Personen Entfernen B: Programm beenden Fehler: ungueltige EingabePersonenverwaltung: Ihre Eingabe: S: Personen Suchen A: Personen anzeigen H: Personen Hinzuf³gen E: Personen Entfernen B: Programm beendenliegt das daran das der 2 zeichen aufnimmt, und durch die while schleife auch 2 Zeichen nacheinander in die Variable legt?
Lässt sich das irgendwie verhindern?
-
Was der Vorredner dir versucht hat zu erklären ist, dass du versuchst Äpfel mit Birnen zu vergleichen.
Du definierst die Variable für die Eingabe als ein char-Array (bzw. einen Zeiger auf ein char-Array).
Mit dem switch-statement switch(eingabe) versuchtest du nun Zeiger zu vergleichen, keine Zeichen. Wenn du dir ganz sicher bist, dass das erste Zeichen in deinem Array ein brauchbares Zeichen enthält, kannst du mit eingabe[0] darauf zugreifen.
Mit dem Wissen, dass eingabe ein Zeiger ist, solltest du nun deine Warnung und den Fehler beseitigen können.
Grüße...
Heiko
-
#include <iostream> #include <cctype> #include <limits> int main() { char input = 'c'; while (input != 'b') { std::cout << "Personenverwaltung:\n" << "S: Personen suchen\n" << "A: Personen anzeigen\n" << "H: Personen hinzufügen\n" << "E: Personen entfernen\n" << "B: Programm beenden\n" << "Auswahl: " << std::flush; while (!(std::cin >> input)) { std::cin.sync(); std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } char input_low = static_cast<char>(std::tolower(static_cast<int>(input))); switch (input_low) { case 's': { // person_search } break; case 'a': { // person_show } break; case 'h': { // person_add } break; case 'e': { // person_delete } break; case 'b': // nichts tun break; default: std::cerr << "FEHLER: Ungueltige Eingabe!" << std::endl; break; } } }... wenn de was nicht verstehst... sagen!
Vor allem hab ich mal alles auf Streams umgestellt, da du ja hier im C++-Forum bist. Deinen eigentlichen Fehler hab ich auch direkt rausgemacht. Ne Endlos-Schleife ist immer unschön und wird dir auch von nem anständigen Kompiler angemeckert. Von daher mach das lieber mit ner Abbruchbedingung ...
-
Danke
-
ich "spiele" jetzt schon ne weile mit c/c++,
aber trotzdem gibts immer wieder sachen die ich nich verstehe...zB beim ersten post,
int main() { char eingabe[]; // 1. while(1){ printf("Personenverwaltung:\n"); printf("Ihre Eingabe:\n"); printf("S: Personen Suchen\n"); printf("A: Personen anzeigen\n"); printf("H: Personen Hinzufügen\n"); printf("E: Personen Entfernen\n"); printf("B: Programm beenden\n"); scanf("%c", &eingabe); switch(eingabe){ case 'S': break; case 'A': break; case 'H': break; case 'E': break; case 'B': return 0; // 2. break; default: printf("Fehler: ungueltige Eingabe"); break; } } return 0; }1. wie groß ist das array?
so wie ich das bis jetzt verstanden hab, wäre das doch das selbe wie ein char array[0], wenn die größe des arrays beim anlegen angegeben wird???oder wie ist das zu interpretieren? char array[] == char * ? aber wo zeigt das dann hin?
oder macht der compiler standartmäßig ein char array[1] draus?
2. ist doch ne abbruchbedingung? ist das nicht egal ob die in der schleife oder im kopf steht?
gruß ToM
-
viele_fragezeichen schrieb:
...aber trotzdem gibts immer wieder sachen die ich nich verstehe...
Dann halt' Dich doch an die Empfehlungen hier.

(D)Evils Code wäre mal ein guter Anfang.Zu den konkreten Fragen:
1. ist einfach undefiniert/falsch in C++ - sollte Dir Dein C++-Compiler auch sagen.
Was schon geht, ist die direkte Initialisierungchar eingabe[] = "Test";, damit ist eingabe 5 Byte lang.
2. mit return verlässt Du die Funktion (hier main()) und nicht nur die Schleife.
Das anschließende "break" ist definitiv überflüssig ("unreachable").
3. Versuche besser nicht, C und C++ über einen Kamm zu scheren - da gibt es zu viele Unterschiede (was ein C++-Compiler "schluckt", muss noch lange nicht durch einen C-Compiler gehen und anders herum).Gruß,
Simon2.
-
ich hab ja nich gesagt, dass ich anders machen will ^^
mir ging es nur ums verständnis,1. in diesem fall hätte, wie ich erwartet habe, auch das "switch(eingabe[0])" nicht funktioniert, war mir nur nicht wirklich sicher ob ich richtig "geraten" habe

2. ok, klingt einläuchtend.
3. das hab ich teilweise schon mitbekommen...

ich hab mit c angefangen und versuche jetzt "langsam" auf c++ umzusteigen, is nur schwerer als ich dachte, irgendwie is die gewohnheit doch stärker als erwartet
und dann nimmt man doch wieder char statt std::string, malloc statt new, (int) statt static_cast<int>...aber ich versuch mich zu bessern

gruß
ToM
-
frage_beantwortet schrieb:
...
aber ich versuch mich zu bessern
Recht so !

Übrigens: Wenn Du konsequent auf string, cout, vector, ... umsteigst, wirst Du bald (und zwar schneller als Du denkst) deren Vorteile zu schätzen lernen.
Klar - man muss sich erstmal ein wenig einlesen und umgewöhnen, aber wenn man mal betrachtet, was man da "geschenkt" bekommt (gerade in Sachen Komfort, Übersichtlichkeit und Sicherheit), wird man es bald nicht mehr missen mögen.
Aus meiner Erfahrung (auch von C nach C++ kommend) kann man sich mit C++-Mitteln besser/schneller auf die wirklich fachlichen Aufgabenstellungen stürzen und hängt nicht so sehr in der Technik fest.Gruß,
Simon2.