If und char arrays?
-
bevor ich auch nur zu einem der offensichtlichen fehler was sage, möchte ich dich drum bitten, deine fehlerbeschreibung zu präzisieren, geht nicht ist _keine_ gute fehlerbeschreibung.
-
überleg mal
du hast also ein array mit einigen elementen ( theoretischen )
So stell dir jetzt die "reale" Welt vor
Du hast einen Schrank mit 20 Schubladen.
Jetzt willst du was reinlegenDa musst du angeben in WELCHE Schublade du es reinlegen willst.
Das gleiche mit dem array. Du musst schon sagen WO du es abspeicherst.
Dann musst du diese Stelle im array auch vergleichen.
-
Die Befehle die Knuddlbaer verwendet hat, kenn ich noch nicht.
Ich habe auch in meinem Buch nachgeguckt, jedoch nicht einen Absatz dazu gefunden.
Zum Text von newkid. Vorstellen kann ich es mir, dennoch weiß ich nicht wie ich das auf c - plus plus übertragen soll.
Ich hab es sogar mit Zeigern u.s.w. ausprobiert, hat auch nicht geklappt.
Mit Strings hab ich noch nicht sehr viel gearbeitet, bin also erst Anfänger.
-
MZ04 schrieb:
Die Befehle die Knuddlbaer verwendet hat, kenn ich noch nicht.
Ich habe auch in meinem Buch nachgeguckt, jedoch nicht einen Absatz dazu gefunden.
Zum Text von newkid. Vorstellen kann ich es mir, dennoch weiß ich nicht wie ich das auf c - plus plus übertragen soll.
Ich hab es sogar mit Zeigern u.s.w. ausprobiert, hat auch nicht geklappt.
Mit Strings hab ich noch nicht sehr viel gearbeitet, bin also erst Anfänger.Vergiss alles was du über char[] oder char * für Zeichenketten gelernt hast und lerne std::string kennen. Wenn du irgendwann denkst, du seist ein Fortgeschrittener oder Profi, dann kannst du dich wieder daran erinnern.
-
Wie schon gesagt, kenn ich diese Befehle nicht und in meinem Buch stehen sie auch nicht. Ich denk mir es ist zu umfangreich mir das hier zu erleutern. Könntet ihr mir dafür ein Toturial empfelen?
-
MZ04 schrieb:
Wie schon gesagt, kenn ich diese Befehle nicht und in meinem Buch stehen sie auch nicht. Ich denk mir es ist zu umfangreich mir das hier zu erleutern. Könntet ihr mir dafür ein Toturial empfelen?
Da gibt es nicht viel zu erklären. Aber wenn es nicht in deinem Buch drin ist, wirf es weg. Man kann sich im Internet das Buch "Thinking in C++" von Bruce Eckel legal herunterladen. Darin werden auch std::string erklärt. Ansonsten gibt es eine Übersicht aller Funktionen eines std::string http://www.sgi.com/tech/stl/basic_string.html
-
Da du offensichtlich ein Buch durcharbeitest, nehme ich mal an, dass du C++ lernst. Deshalb kannst du imo Ponto's Aussage bzgl.
Ponto schrieb:
Vergiss alles was du über char[] oder char * für Zeichenketten gelernt hast
erstmal vernachlässigen.
Zu deinem Problemif (somechar == "a")
Hier sollen zwei Werte verglichen werden, somechar ist vom Typ int[2] und "a" ist ein String-Literal vom Typ const char[]. Kein Compiler wird hier arbeiten, da man einfach nicht weiss wie verglichen werden soll. Bitweise, elementweise, ...? Deshalb funktionieren die Vergleichsoperatoren mit built-in Arrays grundsätzlich nicht. Da musst du schon aktiv werden. Die native Methode wäre, eine Schleife für den Vergleich zu programmieren. Das sieht aber weder schön aus, noch ist es handlich. Dafür gibt es dann Funktionen wie strcmp oder memcmp, die das ganze vereinfachen. Der C++ Weg dafür ist dann std::string, und das sollte irgendwann mal dein Ziel sein.
Ausserdem könntest du dir nochmal Gedanken über deine Vorgehensweise machen, reicht denn ein einzelnes Zeichen nicht aus?char somechar; cin >> somechar; if (somechar == 'a') cout << endl << "Der Buchstabe steht als erstes im Alphabet!";
-
Das stimmt, ich arbeite das Buch bei mir zu Hause durch. Die Frage, die ich gestellt habe gehört zu den Kapitel, welches ich gerade durcharbeite.
Meine Vorgehensweise werde ich zu dem Tipp ändern.
-
Hier bin ich wieder!
Ich habe auf eure Tipps hin versucht den Quellcode zu Kompilieren.
Die Quellcodes sahen volgender maßen aus:#include <iostream.h> #include <string.h> int main() { char sochar; //steht für somechar cout << "Gib einen Buchstaben ein!\n"; cin >> sochar; std::string; // erster Test damit if (sochar == "a") //hieß vorher if (&sochar == "a") cout << "\nDer Buchstabe steht an erster Stelle im Alphabet.\n"; return 0; }
oder
#include <iostream.h> #include <string.h> int main() { char sochar; //steht für somechar cout << "Gib einen Buchstaben ein!\n"; cin >> sochar; strcmp (sochar ; "a"); //vorher mit == versucht statt mit ; cout << "Der Buchstabe steht als erster im Alphabet!\n"; return 0; }
Was hab ich hier verkehrt gemacht?
Der Kompiler ließ es mich nicht Kompilieren!
-
MZ04 schrieb:
Hier bin ich wieder!
Ich habe auf eure Tipps hin versucht den Quellcode zu Kompilieren.
Die Quellcodes sahen volgender maßen aus:#include <iostream.h> #include <string.h> int main() { char sochar; //steht für somechar cout << "Gib einen Buchstaben ein!\n"; cin >> sochar; std::string; // erster Test damit if (sochar == "a") //hieß vorher if (&sochar == "a") cout << "\nDer Buchstabe steht an erster Stelle im Alphabet.\n"; return 0; }
some char kann man ruhig noch ausschreiben. Es wird nachher verwirrender, wenn du alles abkürzt.
Wieso du std::string; schreibst, ist mir schleierhaft. Das erfüllt bei dir gar keinen Zweck. Außerdem ist die richtige Include-Datei <string> und nicht <string.h>.
[EDIT] Wo ich schon dabei bin: Benutze iostream anstatt iostream.h. Wenn du ein Anfänger bist, schreibst du am besten noch die Zeile using namespace std; drunter. [/EDIT]Merken: Sachen, die in doppelten Anführungszeichen (") stehen, sind Zeichenketten. Etwas, das in einfachen Anführungszeichen (') steht, ist genau ein Zeichen. sochar ist ein char, d.h. genau ein Zeichen. Deshalb solltest du überprüfen, ob sochar mit 'a' übereinstimmt.
Was hab ich hier verkehrt gemacht?
Der Kompiler ließ es mich nicht Kompilieren!Es gibt in dem Verzeichnis, wohin du kompilierst, oder wo deine Projektdatei ist, eine Datei (die man meistens mit nem Browser oder Texteditor öffnen kann), in der genau steht, was man falsch gemacht hat. Anfangs wirst du mit manchen Fehlerbeschreibungen nicht viel anfangen können. Aber man kann sich bei vielen schon denken, was man falsch gemacht hat. Es steht sogar die Zeilennummer dabei, sodass du deinen Fehler einschränken kannst.
Wenn du einen Fehler nicht beheben kannst und hierhin ins Forum pastest, dann ist es für die anderen viel leichter, wenn du die Fehlerbeschreibungen mitpostest.
-
Hi so gehts...
#include <iostream> #include <string.h> using namespace std; int main() { string sostring; //steht für somestring ;-) char sochar[2]; string a = "a"; cout << "Gib einen Buchstaben ein!\n"; cin >> sostring; if (sostring == a) { strcpy(sochar,sostring.c_str());//kopiert den Inhalt von sostring in sochar cout <<sochar<< "\nDer Buchstabe steht an erster Stelle im Alphabet.\n"; } return 0; }
Du kannst auch nur mit Strings arbeiten.
Das Umwandeln hab ich nur mit reingepackt damit du siehst wie´s gehtnur mit Strings:
#include <iostream> #include <string.h> using namespace std; int main() { string sostring; //steht für somestring ;-) string a = "a"; cout << "Gib einen Buchstaben ein!\n"; cin >> sostring; if (sostring == a) //hieß: wenn sostring gleich "string" a dann sostring ausgeben :-) cout <<sostring<< "\nDer Buchstabe steht an erster Stelle im Alphabet.\n"; return 0; }
mfg bin
-
bin: Lies dir doch bitte mal meinen vorherigen Post durch. Dein erster Codeschnipsel ist, 'tschuldigung, potthässlich.
-
Michael E. schrieb:
Etwas, das in einfachen Anführungszeichen (') steht, ist genau ein Zeichen.
Nicht ganz. Es kann sich dabei auch um ein Multicharacter-Literal handeln.
Michael E. schrieb:
Dein erster Codeschnipsel ist, 'tschuldigung, potthässlich.
Zudem ist ein String imo vollkommen überdimensioniert, wenns lediglich um ein einzelnes Zeichen geht. Das ist wie die berühmte "mit Kanonen auf Spatzen schiessen" Mentalität.
-
Danke für eure Antworten!
Ich habe endlich ein Lösungsweg gefunden. Die Tipps von bin Funktionierten bei mir nicht. Dennoch die Tipps von Michael E. Funktionierten. Jetzt sieht es Folgender maßen aus:#include <iostream> int main() { char sochar; //steht für somechar cout << "Gib einen Buchstaben ein!\n"; cin >> sochar; if (sochar == 'a') cout << "\nDer Buchstabe steht an erster Stelle im Alphabet.\n"; return 0; }
Mit der Zeile : using namespace std;
konnte ich nichts anfangen. Wofür ist die eigentlich gut?
-
Lediglich C Sachen (zB strcpy) haben aufgrund Abwärtskompatibilität in C++ überlebt und können iirc auch über den globalen namespace angesprochen werden.
Der Rest gehört dann zur STL (zB cout, cin, string, etc.) und befindet sich im namespace std. Dh du musst auch entsprechend darauf zugreifenstd::cout << "hello world!" << std::endl;
Leider gibt es einige Implementationen, die das nicht richtig umsetzen. Und die, auf die dein Code aufbaut, scheint dafür ein Beispiel zu sein. Genauso funktioniert dieser falsche Code, wenn man zB die alte "iostream.h" benutzt.
Um nicht ständig std:: schreiben zu müssen, kann man die using Direktive benutzen.using namespace std;
Damit werden dann alle Sachen aus std in den aktuellen namespace eingebunden. Ist dir das zuviel und es kommt zu Namenskonflikten, weil du zB 'ne eigene string Klasse hast, kannst du auch die using Deklaration benutzen, um nur einzelne Sachen einzubinden.
using std::cout; using std::cin;
edit:
Flüchtigkeitsfehler aufgrund operator void's Meckern geändert
-
groovemaster schrieb:
Lediglich C Sachen (zB strcpy) haben aufgrund Abwärtskompatibilität in C++ überlebt und können iirc auch über den globalen namespace angesprochen werden.
Wenn man die alten Header einbindet (string.h in dem Fall). Die sind aber AFAIK deprecated.
Der Rest gehört dann zur STL (zB cout, cin, string, etc.)
Nein, zur Standardbibliothek :p
using cout; using cin;
Und da fehlt zwei Mal das std::.
So, genug gemeckert. Jetzt bin ich wach
-
operator void schrieb:
Wenn man die alten Header einbindet (string.h in dem Fall). Die sind aber AFAIK deprecated.
Ich hab ja auch nicht behauptet, <string.h> einzubinden. Dafür gibts dann <cstring>. :p