Hallo, ich suche schon seit einer weile nach der lösung für ein problem. und zwar habe ich vor zwei wochen mit xcode angefangen mal ein bisschen was auszuprobieren.und jetzt habe ich mein erstes größeres problem... das ist mein quelltext dazu: #include <iostream> using namespace std; int main (int argc, char * const argv[]) { anfang: char masseinheit [20]; char Koerper; int seitenlaenge; int oberflaecheninhalt; int volumen; cout << "was für eine maßeinheit benutzen sie? "; cin >> masseinheit; cout << "was für einen körper wollen sie berechnen? "; cin >> Koerper ; switch ( Koerper) { case "wuerfel": cout << "wie ist die seitenlänge ihres würfels? "; cin >> seitenlaenge; break; case "quader": cout << "wieso kein würfel quader kann ich noch nicht"; break; } oberflaecheninhalt = seitenlaenge * seitenlaenge * 6; volumen = seitenlaenge * seitenlaenge * seitenlaenge; cout << "der oberflächeninhalt beträgt " << oberflaecheninhalt << masseinheit << "^2" << endl; cout << "das volumen beträgt " << volumen << masseinheit << "^3" << endl; return 0; } und jetzt mein problem: es gibt in den roten zeilen die fehlermeldung "case label does not reduce to an integer constant" was muss ich ändern damit das projekt funktioiert? ich hoffe einer kann mir helfen... danke, lg cormare
Abend! switch kannst du nicht mit Strings verwenden, nur char oder int würden funktionieren. Wenn du bei deiner Variante bleiben willst, musst du das switch-Statement durch if-Abfragen ersetzen.
Also switch sollte schon mit Strings verwendbar sein. Nur macht er oben eine Auswahl via Switch über "Körper" udn hat das als Integer definiert. Die Abfrage macht er dann aber über Strings. Daran scheitert es.
boa wie schnell ihr hier seid... ja am anfang hatte ich das mal mit if probiert aber da kam auch irgendein fehler. ich probiers nochmal und guck was der dann sagt...
Sehe ich auch so, ein String ist ja kein primitiver Datentyp, den man so einfach vergleichen kann. Ist char EIN Zeichen Wenn man ein char-Array über den Bezeichner vergleichen will, nimmt der Compiler die Speicheradresse. Ich würde bei char-Arrays das so schreiben: Code: char* Koerper; . . . if(strcmp(Koerper, "wuerfel")) ....usw schreiben
Ein Switch funktioniert in der Tat nicht über Strings. Das macht er aber auch nicht. Obiger Code hat nämlich nicht den Vergleich von Strings als Semantik, sondern den Vergleich von String-Zeigern. Das will er mutmaßlich aber nicht. In der Tat liegen hier zudem die bereits benannten Fehler vor: Es wird ein Char (der wiederum ein Int ist), mit einem Zeiger verglichen. @OP: Wenn du wirklich hier den Text vergleichen willst, musst du a) entweder mit if und strncmp arbeiten b) Stringkonstanten definieren, die zugewiesen werden. *C* ist nicht PHP.
Und wie immer zeigt sich: Die Fehlermeldungen von gcc sind vollkommen ausreichend Natürlich lässt sich ein String nicht auf eine Intergerkostante reduzieren. Alex
Also, die bisherigen Antworten waren schon richtig. std::string erlaubt den Vergleich von Strings mit Zeichenketten, so daß man das Problem ungefähr so formulieren kann. Code: #include <iostream> #include <string> using namespace std; int main () { std::string Koerper; char masseinheit [20]; int seitenlaenge; int oberflaecheninhalt; int volumen; cout << "was für eine maßeinheit benutzen sie? "; cin >> masseinheit; cout << "was für einen körper wollen sie berechnen? "; cin >> Koerper ; if (Koerper == "wuerfel") { cout << "wie ist die seitenlänge ihres würfels? "; cin >> seitenlaenge; } else if (Koerper == "quader") { cout << "wieso kein würfel quader kann ich noch nicht"; } oberflaecheninhalt = seitenlaenge * seitenlaenge * 6; volumen = seitenlaenge * seitenlaenge * seitenlaenge; cout << "der oberflächeninhalt beträgt " << oberflaecheninhalt << masseinheit << "^2" << endl; cout << "das volumen beträgt " << volumen << masseinheit << "^3" << endl; }
Ja, das war alles schon sehr hilfreich, danke. Aber eins hab ich noch wenn ich das jetz so schreibe: if (strcmp(Koerper,"wuerfel")) { oberflaecheninhalt = seitenlaenge * seitenlaenge * 6; volumen = seitenlaenge * seitenlaenge * seitenlaenge; cout << "der oberflächeninhalt beträgt " << oberflaecheninhalt << masseinheit << "^2" << endl; cout << "das volumen beträgt " << volumen << masseinheit << "^3" << endl; } else { cout << "ungültig " << endl; } dann sagt er mir wenn ich als Körper wuerfel eingebe "ungültig" wie krieg ich das noch hin, dann is alles gut. lg cormare
Internet-Doku: (--> Link) Return Value Returns an integral value indicating the relationship between the strings: A zero value indicates that both strings are equal. A value greater than zero indicates that the first character that does not match has a greater value in str1 than in str2; And a value less than zero indicates the opposite. Die if-Verzweigung führt den Code unter if aus, wenn die Bedingung 1 ergibt, den Code unter else, wenn sie 0 ergibt. Jetzt ist es so, dass strcmp() 0 zurückgibt, wenn die strings gleich sind. Also wäre die korrekte Verzweigung so zu formulieren, wenn du unter if den true-Code schreibst: if (!strcmp(str1, str2)) { // "!" kehrt den Rückgabewert um... (0 --> 1 / ungleich 0 --> 0) // True-Code} else { // False-Code} Gruss, ppocket
ja genau...char*. ich dachte das wär klar. Aber das von poljpocket hats schon getan. Trotzdem seid ihr mich noch nicht los^^, aber bald geb ich echt Ruhe =) so siehts jetzt aus ,aber sobald ich die Seitenlänge eingegeben habe, bricht der ab... warum das nun wieder? danke... lg cormare p.s.: soooo sieht das dann aus:
Das ist nicht klar, weil das unsinnig ist. "char*" ist ein Zeiger auf einen C-String, den Du aber gar nicht definierst! Ergo, kommt da nur Unfug bei raus. Wenn es zufällig funktioniert, dann ist das um so schlimmer. Nochmals Entweder Du nutzt std::string zum Einlesen der Texte, oder Du mußt anfangen Inputbuffer zu definieren. Dabei ist es wichtig die maximale Länge des Buffers mit anzugeben, da es andernfalls zu Buffer Overflows kommt -> Sicherheitslöcher. Code: #include <iostream> #include <string> using namespace std; int main (int argc, char * const argv[]) { anfang: char masseinheit[81]; // 80 Zeichnen + '\0' char Koerper[81]; // 80 Zeichnen + '\0' int seitenlaenge; int oberflaecheninhalt; int volumen; cout << "was für eine maßeinheit benutzen sie? "; cin >> std::setw(81) >> masseinheit; cout << "was für einen körper wollen sie berechnen? "; cin >> std::setw(81) >> Koerper ; if (!strcmp(Koerper, "wuerfel")) { cout << "was für eine seitenlänge hat ihr würfel? "; cin >> seitenlaenge; oberflaecheninhalt = seitenlaenge * seitenlaenge * 6; volumen = seitenlaenge * seitenlaenge * seitenlaenge; cout << "der oberflächeninhalt beträgt " << oberflaecheninhalt << masseinheit << "^2" << endl; cout << "das volumen beträgt " << volumen << masseinheit << "^3" << endl; } else { cout << "ungültig " << endl; } goto anfang; }
Naja, tut mir ja leid aber wie gesagt mach ich das erst seit zwei Wochen und hab deshalb noch nich so wirklich n Peil davon. aber ist schon echt cool wie viele hier antworten und wirklich auch helfen mit ihren Posts und mich nicht nur runtermachen auf grund meiner großen Unwissenheit.... =) danke nochmal... lg cormare
Auf Grund Deiner Postings sieht man sofort, daß Du Dich noch nicht lange mit C++ beschäftigst. In C++ kann man die C-Strings oder die std::string benutzen. Während C-Strings so einiges an Wissen abverlangen, wie man sich richtig verwendet, kümmert sich std::string um die meisten elemantaren Dinge, zum Beispiel die Speicherverwaltung. Im Falle von "cin >> koerper", ist das Verhalten extrem davon abhängig, welchen Typ "koerper" hat. Als std::string wird automatisch Speicher reserviert und die Eingabe kann so lang sein, wie das der Nutzer will. Bei einem "char*" muß vorher Speicher reserviert werden, und "cin" darf nur maximal soviel Zeichen liefern, wie der Speicher groß ist. Anschließend muß man den Speicher wieder selbst freigeben. Die Alternative, die ich Dir im letzten Beispiel gezeigt hatte, war mit einem char[] mit fester Größe. Auch hier gibt es das Problem mit der maximalen Länge der Eingabe, aber dafür muß man sich ebenfalls nicht um die Speicherverwaltung kümmern. Bevor Du mit "char*" anfängst solltest Du Dir in Deinem Lehrmaterial das Kapitel mit Zeiger durchlesen. Für den Anfang ist aber die Benutzung von std::string definitiv vorzuziehen.