Wie mit Strings arbeiten?!
-
Hallo,
folgende Aufgabe habe ich bekommen:
Man soll 2 Farben eingeben und der Mischwert soll gemäß Tabelle ausgegeben werden.
http://mitglied.lycos.de/inselkampf/c++/tabelle.jpgHier meine Idee, noch nicht in eine Funktion ausgelagert
#include <iostream.h> int main() { char farbe1[5], farbe2[5]; cout<<"Bitte Farbe1 eingeben ( rot, gruen, blau ): \n"; cin>>farbe1; cout<<"Bitte Farbe2 eingeben ( rot, gruen, blau ): \n"; cin>>farbe2; if(*farbe1 == *farbe2) cout<<"Die Mischung der beiden Farben ergibt "<<farbe1<<".\n"; if(farbe1 == gruen && farbe2 == rot || farbe1 == rot && farbe2 = gruen) cout<<"Die Mischung der beiden Farben ergibt gelb\n."; if(farbe1 == gruen && farbe2 == blau || farbe1 == blau && farbe2 = gruen) cout<<"Die Mischung der beiden Farben ergibt cyan\n."; if(farbe1 == blau && farbe2 == rot || farbe1 == rot && farbe2 = blau) cout<<"Die Mischung der beiden Farben ergibt gelb\n."; return(0); }
Das mit *farbe1 == *farbe2 klappt ja noch sehr gut, aber danach gehts (logischerweise) nicht mehr, wie würdet ihr den Inhalt vergleichen?
/edit: Link in Ordnung gebracht
-
Das mit der Tabelle hat wohl leider nicht geklappt, einfach Link kopieren und im browser einfügen
Sorry
-
Hallo NetterGast!
Wenn du es schon mit C-Strings löst, dann solltest du
1. genug Speicher für die Eingabe zu Verfügung stellen
char farbe1[5], farbe2[5]; // Vier Zeichen... Was aber wenn der Benutzer mehr eingibt? ;)
2. richtig vergleichen, und zwar mittels strcmp()
if (*farbe1 == *farbe2) // Nonsens, hier wird jeweils nur der erste Buchstabe verglichen ... // RICHTIG: if (strcmp(farbe1, farbe2) == 0) ...
Und rot, gruen, blau usw. musst du dann natürlich in Anführungszeichen setzen
// EDIT
Natürlich muss auch der benötigte Header eingebunden werden:#include <iostream> // .h-Header der Standardbibliotheken zu verwenden ist veraltet! #include <cstring> using namespace std;
gruß,
walker
-
char farbe1[5] besagt doch das dieses Array Platz für 5 Buchstaben ( von 0-4 )gibt und somit reicht es doch da nur rot, gruen und blau zur Auswahl stehen.
Deinem zweiten Einwand stimme ich zu, der Pointer vergleicht wirklich nur den Inhalt des ersten Listenfeldes.
Aber wie soll ich strcmp bei den anderen 3 ifs unterbringen?
-
NetterGast schrieb:
char farbe1[5] besagt doch das dieses Array Platz für 5 Buchstaben ( von 0-4 )gibt und somit reicht es doch da nur rot, gruen und blau zur Auswahl stehen.
Das ist nicht ganz richtig, C-Strings werden nämlich mit einem sogenannten Nullterminierungszeichen ('\0') abgeschlossen
Du kannst jetzt natürlich char farbe[6]; schreiben und dich darauf verlassen, dass der Benutzer wirklich nur fünf
Zeichen eingibt, aber wenn er _mehr_ eingibt, dann kommt es höchstwahrscheinlich
zu einem Speicherzugriffsfehler.Bei einem std::string hättest du dieses Problem nicht, da sich der String der Länge der Eingabe anpasst (und die Vergleiche wären auch einfacher).
gruß,
walker
-
Aber dieses \0 wird doch schon eingeplant wenn ich sage Array[5] bekomme ich auch meine 5 Felder oder nicht?
Wie dem auch sei, habs mit Zahlen gemacht
#include <iostream.h> int main() { int farbe1, farbe2; cout<<"Bitte Farbe1 eingeben ( 1=rot, 2=gruen, 3=blau ): \n"; cin>>farbe1; cout<<"Bitte Farbe2 eingeben ( 1=rot, 2=gruen, 3=blau ): \n"; cin>>farbe2; if(farbe1 == farbe2) cout<<"Die Mischung zwei gleicher Farben ergibt keine neue Farbe!\n"; if(farbe1 == 2 && farbe2 == 1 || farbe1 == 1 && farbe2 == 2) cout<<"Die Mischung der beiden Farben ergibt gelb.\n"; if(farbe1 == 2 && farbe2 == 3 || farbe1 == 3 && farbe2 == 2) cout<<"Die Mischung der beiden Farben ergibt cyan.\n"; if(farbe1 == 3 && farbe2 == 1 || farbe1 == 1 && farbe2 == 3) cout<<"Die Mischung der beiden Farben ergibt purpur.\n"; return(0); }
-
NetterGast schrieb:
Aber dieses \0 wird doch schon eingeplant wenn ich sage Array[5] bekomme ich auch meine 5 Felder oder nicht?
Nein, ist in C/C++ nicht so, das Nullterminierungszeichen muss miteinberechnet werden.
gruß,
walker
-
NetterGast schrieb:
Aber dieses \0 wird doch schon eingeplant wenn ich sage Array[5] bekomme ich auch meine 5 Felder oder nicht?
Ja, du bekommst 5 Felder. Aber eins davon wird hier für '\0' benötigt, dh du kannst maximal 4 Zeichen sinnvoll belegen.