Pointer If Bedingung etwas Seltsam ( weil ich es nicht kenne)
-
midu40 schrieb:
" if(!string[WordOffset]) "
{
return false
}der string ist ein pointer als type char mit Array
Mit der Beschreibung kann ich nichts anfangen. Poste notfalls die Deklaration.
Normalerweise würde ich bei einem "string" einen Zeiger auf char oder ein Array von char erwarten.
und wenn ich logisch nachdenke ist es so gedacht das es eine Überprüfung ist das der char string gleich groß sein soll wie der WordOffset
Könnte sein. Wie genau kommst du darauf?
aber wie so ist das dann nicht so geschrieben if (!string==WordOffset)
Das ist wenn überhaupt ein Test auf Gleichheit, kein Test auf gleiche Größe.
-
danke für sie schnelle Antwort also
wenn ich es richtig verstehe ist ein vergleich von der Größe ob string die Gleiche Größe wie WordOffset hat ( würde sinn ergeben )
ich schaue mit das mit den Arrays in c aneine frage ich lerne eigentlich c++ macht es ein unterschied ob es c oder c++ ist bei arrays
wenn Bashar nicht mit der Beschreibung nichts anfangen kann poste ich mal den ganzen Code damit Ihr auch den Verwendungszweck seht
include <iostream> #include <ctype.h> #include <string.h> bool GetWord(char*string, char*word, int &wordOffset); int main() { const int bufferSize = 255; char buffer[bufferSize+1]; // enthält den ganzen Sting char word [bufferSize+1]; // enthält das Wort int wordOffset = 0; std::cout << "Geben Sie einen String ein: "; std::cin.getline(buffer,bufferSize); while (GetWord(buffer,word,wordOffset)) { std::cout << "Dieses Wort ausgelesen: " << word << std::endl; } system("pause"); return 0; } // Funktion zum Auslesen von wörter aus einem String. bool GetWord(char* string, char* word, int& wordOffset) { if(!string[wordOffset]) //Ende den 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 es ein wort ergibt if (!isalnum(p2[0])) p2++; //p1 zeigt jetzt auf den Anfang des naechsten Wortes // mit p2 auch darauf zeigen p2 =p1; //setzten p2 an das Ende des Wortes while(isalnum(p2[0])) p2++; //p2 ist jetzt am Ende des Wortes //p1 ist jetzt am Anfang des Wortes //Laenge des Wortes ist die Differenz int len = int (p2 - p1); // Kopieren das Wort in den puffer strncpy (word,p1,len); //null beenden 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; }ps. wenn's unübersichtlich ist bitte sagen und Verbesserungsvorschläge machen
-
midu40 schrieb:
danke für sie schnelle Antwort also
wenn ich es richtig verstehe ist ein vergleich von der Größe ob string die Gleiche Größe wie WordOffset hat ( würde sinn ergeben )Eigentlich prüft es, ob sich in string an der Stelle wordOffset ein Nullzeichen, also die Endemarkierung, befindet. Es kann sein, dass schon vorher ein Nullzeichen gestanden hat, dann ist das nicht die Länge.
eine frage ich lerne eigentlich c++ macht es ein unterschied ob es c oder c++ ist bei arrays
Es gibt riesige Unterschiede zwischen C und C++, aber eher darin, dass man in C++ mehr Abstraktionsmöglichkeiten hat und allgemein an Problem anders herangeht. Die Technik ist auf so niedriger Ebene wie Arrays weitestgehend identisch.
wenn Bashar nicht mit der Beschreibung nichts anfangen kann
Ich meinte deine Beschreibung, welchen Typ string nun haben soll. Es ist einfach ein Zeiger auf char, nicht "pointer als type char mit Array".
-
Bashar ich Entschuldige mich wenn Sie sich durch meine Antwort angegriffen fühlen. Ich bin leider ein Anfänger und deswegen könnte ich Sie nicht richtig verstehen und hab deswegen mich dazu entscheiden, gleich alles zu posten, um weiteren nachfragen zu verschonen.
sorryaber das mit dem null zeichen verstehe ich nicht weil der wert in der
74 ZeilewordOffset =int(p2-string);verändert wird und dadurch dürfte er immer die selbe große, am Ende, haben wie aufgenommene Zeichen in dem String ??
oder verstehe ich das falsch ?
tut mir echt leid wenn ich Sie angegriffen habe.

-
midu40 schrieb:
Bashar ich Entschuldige mich wenn Sie sich durch meine Antwort angegriffen fühlen. Ich bin leider ein Anfänger und deswegen könnte ich Sie nicht richtig verstehen und hab deswegen mich dazu entscheiden, gleich alles zu posten, um weiteren nachfragen zu verschonen.
sorryWir sind hier im Internet, keiner siezt hier. Und Bashar wird sich nicht angegriffen fühlen (ich übrigens auch nicht, nur für den Fall
).aber das mit dem null zeichen verstehe ich nicht weil der wert in der
74 ZeilewordOffset =int(p2-string);verändert wird und dadurch dürfte er immer die selbe große, am Ende, haben wie aufgenommene Zeichen in dem String ??
oder verstehe ich das falsch ?
Der wordOffset erhält die Differenz zwischen p2 und string, d.h. die Position am Anfang des nächsten Wortes.
Zeigt p2 auf das Ende des Strings, d.h. auf die terminierende Null, dann ist die Bedingung !string[wordOffset] beim nächsten Funktionsaufruf true, und die Schleife bricht ab.
-
cool danke
jetzt raffe ich das
hab auch mit dem arrays nochmal nach geschaut und Zeigern
also war das was ich am Anfang gefragt habe nur ein vergleich der großen
bzw. die anzahl der array mit dem WordOffset als intgut und das mit der terminierende null mein man eigentlich den false zustand
richtig ?
weil in zeile 64 wirdword[len]='\0';für die Ausgabe eine null als terminierend genommen ( wenn man das zu sagen darf fachlich )
deswegen war ich etwas verwirrt danke an euch
das hier ist ein echt gutes Forum
-
midu40 schrieb:
also war das was ich am Anfang gefragt habe nur ein vergleich der großen
bzw. die anzahl der array mit dem WordOffset als int?
gut und das mit der terminierende null mein man eigentlich den false zustand
richtig ?Sie markiert das Ende vom C String, strlen bspw. läuft in einer Schleife so lange durch, bis es sie findet.
weil in zeile 64 wird
word[len]='\0';für die Ausgabe eine null als terminierend genommen ( wenn man das zu sagen darf fachlich )
Richtig, um das Ende zu markieren, was dann später std::cout nutzt um zu wissen, welchen Speicher es nicht mehr ausgegeben darf.
deswegen war ich etwas verwirrt danke an euch
das hier ist ein echt gutes Forum
Trotzdem eine Bitte: Satzzeichen helfen der Lesbarkeit ungemein, genauso wie exakte Formulierung und nochmaliges Drüberlesen über die eigenen Beiträge.
Ich hab nicht immer die Zeit/bin so gut gelaunt, so etwas zu verstehen versuchen.
Und wer unsauber spricht, programmiert vermutlich auch so, was uns ein negatives Bild von dir von vorne herein vermittelt.
-
okay
Das mit der Terminierenden Null habe ich jetzt verstanden.Mit dem Großen meinte ich, dass der String in der Eingabe eine Bestimmte Menge an Arrays bearbeitet. bzw. in den Arrays den Code der Zeichen speichert.
Und wenn ich in WordOffset(Zahlenwert) die selbe große wie verwendete Arrays bzw. gespeicherte Zeichen anzahl habe, so weiß ich, dass ich alle wichtige Arrays, die ein Zeichen beinhalten, ausgelesen habe und kann die Schleife beenden.
Sonst würde die Schleife fröhlich weiter machen.
Das mit dem Satzzeichen und den anderen bitten, gehe ich gerne ein.
Nur wenn ich es vergesse oder trotz meinen Bemühungen nicht richtig Antworten kann, bitte ich euch mich drauf hinzuweisen.Und verzeiht mir, aber Trotzdem danke.

-
Nathan schrieb:
Trotzdem eine Bitte: Satzzeichen helfen der Lesbarkeit ungemein, genauso wie exakte Formulierung und nochmaliges Drüberlesen über die eigenen Beiträge.
Ich hab nicht immer die Zeit/bin so gut gelaunt, so etwas zu verstehen versuchen.
Und wer unsauber spricht, programmiert vermutlich auch so, was uns ein negatives Bild von dir von vorne herein vermittelt.Gut gesagt. Leider bin ich oft etwas unfreundlicher was das Thema betrifft.
-
[quote="midu40"]
include <iostream> #include <ctype.h> #include <string.h>Das ist Schrott. (auch wenn dein Lehrer dir dieses so gezeigt hat)
Entweder C oder C++, aber nicht beides.bool GetWord(char*string, char*word, int &wordOffset);Dasselbe. C++ Referenz und C String, auch wieder Designschrott.
for (int i = int (p2 - string); i< (int)strlen (string) && !isalnum(p2[0]); i++)Schrott.
int C++ Objekt völlig unnötig, sollte wohl (int)(p2-string) heißen.
(int)-Cast auf strlen - ebenso Müll.ps. wenn's unübersichtlich ist bitte sagen und Verbesserungsvorschläge machen
Da gäbe es vieles wenn nicht alles zu kritisieren.