Code in einem Buch -> schwer verständlich (fast keine Erklärung)
-
Hallo Leute!
Also ich lerne C++ und bin gerade
bei Kapitel 8 angekommen in dem es um Zeiger
geht verstehe auch alles gewissermaßen bis
dann dieser Code hier kommt:#include <iostream.h> #include <ctype.h> #include <string.h> bool GetWord(char* string, char* word, int& wordOffset); // Treiberprogramm int main() { const int bufferSize = 255; char buffer[bufferSize+1]; // enthält den ganzen String char word[bufferSize+1]; // enthält das Wort int wordOffset = 0; // am Anfang beginnen cout << "Geben Sie einen String ein: "; cin.getline(buffer,bufferSize); while (GetWord(buffer,word,wordOffset)) { cout << "Dieses Wort ausgelesen: " << word << endl; } char end; cin >> end; if (end) {return 0;} } // Funktion zum Auslesen von Wörter aus einem String. bool GetWord(char* string, char* word, int& wordOffset) { if (!string[wordOffset]) // Ende des Strings? return false; char *p1, *p2; p1 = p2 = string+wordOffset; // zeigt auf das naechste Wort // beseitigt fuehrende Leerzeichen for (int i = 0; i<(int)strlen(p1) && !isalnum(p1[0]); i++) p1++; // feststellen, ob sich ein Wort ergibt if (!isalnum(p1[0])) return false; // p1 zeigt jetzt auf den Anfang des naechsten Wortes // mit p2 auch darauf zeigen p2 = p1; // setzt p2 an das Ende des Wortes while (isalnum(p2[0])) p2++; // p2 ist jetzt am Ende des Wortes // p1 ist am Anfang des Wortes // Laenge des Wortes ist die Differenz int len = int (p2 - p1); // kopiert das Wort in den Puffer strncpy (word,p1,len); // null beendet es word[len]='\0'; // sucht jetzt den Anfang des naechsten Wortes for (int i = int(p2-string); i<(int)strlen (string) && !isalnum(p2[0]); i++) p2++; wordOffset = int(p2-string); return true; }
Darunter sind ein paar Funktionen die wirklich
noch nie erklärt wurden in dem Buch und mich sehr
irritieren.z.B. p1 = p2 = string+wordOffSet
Wie kann man Adressen addieren?
UND einem Zeiger zufügen?
und was hat das für einen Sinn?word[len]='\0' was bedeutet das?
strncopy (word,p1,len) und das?
oder das -> i<(int)strlen(p1) ?
-
Deathdragon schrieb:
z.B. p1 = p2 = string+wordOffSet
Wie kann man Adressen addieren?Pointerarithmetik
int array[32]; //array ist ein int-Pointer *array = 7; array[0] = 7; //beide Zeilen sind identisch *(array + 5) = 3; array[5] = 3; // auch diese Zeilen sind identisch
Dabei ist array dein Pointer (string) und 5 dein Offset. Da du die Addresse uebergibst, brauchst du auch keine klammern und die Dereferenzierung.
p = string + wordOffSet; p = &(string[wordOffSet]); // identisch
word[len]='\0' was bedeutet das?
'\0' beendet eine Zeichenkette.
i<(int)strlen(p1) ?
strlen gibt die Laenge des Strings zurueck (Anzahl der Zeichen)
-
p1 = p2 = string+wordOffSet
verschiebt einen zeiger um wordOffSet stellen. dh wenn wordoffset die länge eines wortes ist, kommt man so zum nächsten wort./0
ist das stringende zeichen, und muss benutzt werden, damit chararrays richtig funktionieren.strncopy (word,p1,len)
kopiert die nächsten len zeichen von p1 nach word.
-
Zu 1.)
Sowas geht tatsächlich.p1 = p2 = string+wordOffSet
Zuerst wird der der Zeiger auf string um wordOffSet verschoben. Anschliessend wird das Ergebnis an p2 zugewiesen. Und anschliessend wird der gleiche Wert auch an p1 zugeweisen. Das heisst nach Ausführung dieser "Zeile" haben p1 und p2 den gleichen Wert, und zwar verweisen sie auf die Adresse von string+wordOffSet. So ein Konstrukt gehört halt zu den kleinen "Besonderheiten" von C/C++.
Zu 2.)
word[len]='\0'
Du weist dem ersten Element des char-array word das Zeichen 0x00 zu. Damit ist word ein c-string der Länge 0.
Zu 3.)
strncopy (word,p1,len)
Damit kopierst du den c-string p1 zeichenweise in den c-string word, aber maximal höchstens len Zeichen.
Zu 4.)
i<(int)strlen(p1)
damit wird überprüft ob die Länge des c-string p1 grösser als i ist. Das (int) biegt den Returncode von strlen von size_t nach int um. Diese "Typanpassung" nennt man casting in C/C++
PS. Wenn dieses Buch vorgibt das man damit C++ lernen kann, würde ich es an deiner Stelle, ganz schnell, ganz weit, wegwerfen.
mfg JJ
-
Ich war schneller...
John Doe schrieb:
Du weist dem ersten Element des char-array word das Zeichen 0x00 zu. Damit ist word ein c-string der Länge 0.
Ich glaube nicht, da aus p1 != p2 folgt, dass len != 0 für isalnum(p2[0]) == true. Mit '\0' beendet man zwar den string, dieser hat also nicht die Länge 0, sondern len...
-
Das ist aus C++ in 21 Tagen oder? Ziemlich dämliches Programm (hab ich mir schon mehrmals wegen irgendwelcher Fragen dazu angucken müssen), und falsch noch dazu. Überlies es besser oder versuchs mit einem anderen Buch.
-
@bashar
mag sein, es ist nicht das beste.. aber wat solls.ich habe schon viel viel schlechtere bücher gesehen
-
elise: Falls du Zeit hast, kannst du mal versuchen, dieses Programm Zeile für Zeile zu untersuchen. Vielleicht verstehst du dann meine Meinung.
Das heißt natürlich nicht, dass es mit genug Energie nicht auch noch viel schlechter geht
-
@bashar
klar versteh ich die.aber du kannst, wenn du zeit hast, mal ein paar bücher nach noch schlechterem code durchforsten.. und wirst ohen probleme fündig werden.
es ist alles relativwir können ja fehlernährungen vornehmen und fehlerfortdingsdas.. machen.
-
jaja.. lieber einen zuviel als einen zuwenig
http://board.buha.info/showthread.php?t=44794