Hallo ich arbeite gerade an einem kleinen Projekt für meinen
Professor.Leider bin ich noch recht neu im Umgang mit C.Darum bitte ich
um Entschuldigung für mein Unverständnis.Hier mein Problem ich bekomme
einen String z.b "34,567,55,77". Diesen soll ich nun anhand der Kommas
zerlegen und zwischenspeichern für eine spätere Verarbeitung.
Besetn dank schon mal für die Hilfe.
Dennis S. schrieb:
> Die Stringschnipsel.Diese soll ich später mit einer hinterlegten Liste> verkleichen und einzelne Funktionen dadurch aufrufen.
Das kommt jetzt drauf an.
strtok ermöglicht dir 2 Arten der Weiterverwendung
Die eine ist: du kopierst die Einzelteile in neue Strings um (also
jeweils in eigene char Arrays)
Die andere ist: strtok hinterlässt den String in einer Form, dass man
Pointer in den Originalstring als neue Stringanfänge bekommt, so dass
man dem weiterverabeitende Programm auch hier ein 'Array von Strings'
unterjubeln kann, welches in Wirklichkeit nur aus Pointern in ein und
denselben String besteht.
Hier hat man also gewisse Freiheiten, um sich an der Weiterverarbeitung
der Einzelteile zu orientiern und die Verwendung von strtok daran
anzupassen.
Karl heinz Buchegger schrieb:
> welches in Wirklichkeit nur aus Pointern in ein und> denselben String besteht.
Hatte ich auch schon überlegt. Kommt halt drauf an, ob der Orginalstring
erhalten bleibt.
Wäre schon elegant. Dann kann er aber auch einfach den String
durchlaufen und bei jedem Komma einen neuen Pointer setzen und das Komma
durch eine \0 ersetzen.
Ich denke ich würde die einzelnen Teile in neue Strings kopieren.Ist für
mich glaube ich dann erst mal einfacher zu verstehen.
Besten dank schon mal für die Hilfsbereitschaft hier.
Zwei Möglichkeiten:
1.
Mach ne verkettete Liste mit je einem Eintrag für jeden Substring der
Dynamisch allokiert wird, dann bist Du super flexibel und verbrauchst
nicht unnötig Speicher.
2. Ermittle zuerst wie viele Einträge der Orginalstring hat und die groß
der längste davon ist und allokier ein array char[length][size] und trag
da die Schnipsel ein. Ist natürlich je nachdem wie groß die Länge der
Einträge scwankt etwas Speicherverschwendung.
Gruß
Tom
Thomas Burkhart schrieb:
> Karl heinz Buchegger schrieb:>> welches in Wirklichkeit nur aus Pointern in ein und>> denselben String besteht.>> Hatte ich auch schon überlegt. Kommt halt drauf an, ob der Orginalstring> erhalten bleibt.>> Wäre schon elegant. Dann kann er aber auch einfach den String> durchlaufen und bei jedem Komma einen neuen Pointer setzen und das Komma> durch eine \0 ersetzen.
Ja, klar.
strtok hat ein paar (für manche Zwecke) unangenehme Eigenschaften. zb
werden mehrere hintereinderliegende gleiche Trennzeichen übersprungen.
Das kann manchmal gewollte sein (wenn es zb gilt die Trennung über
Leerzeichen zu machen) ist aber manchmal ein echter Show-Stopper.
Dennis S. schrieb:
> Ich denke ich würde die einzelnen Teile in neue Strings kopieren.Ist für> mich glaube ich dann erst mal einfacher zu verstehen.
Das kommt drauf an.
Stringhandling in C, mit Strings deren Länge man im Vorraus nicht kennt,
ist eine recht unangenehme Sache.
Bei meinem Programm ist nur ein Trennzeichen vorgesehen.Denke mal die
einzelnen Teilsstrings werden nicht grösser als 30-40 Zeichen was ich so
rausgehört habe.
Wenn ich das richtig verstanden habe, sollte das genau das sein was du
suchst. Schaus dir einfach mal an (inklusive der reference zu den
einzelnen Funktionen)
Ich teile meinen String mit strtok auf und kopiere dann die Daten mit
strcpy auf meinene im strcut festgelegten Parameter.
Besten dank noch mal für die tolle Hilfe hier.
Dennis S. schrieb:
> Ich teile meinen String mit strtok auf und kopiere dann die Daten mit> strcpy auf meinene im strcut festgelegten Parameter.
Wo kommt der Originalstring her?
Besteht die Möglichkeit, dass der String fehlerhaft ist?
Wenn den ein Benutzer eingibt, musst du immer damit rechnen, dass der
fehlerhaft ist!
Kriegst du den von einer Schnittstelle von einem anderen Programm
zugespielt, reicht es die Maximallänge zu testen. Aber selbst dann
sollte man im Hinterkopf behalten, dass die zur Verfügung stehenden
char-Arrays nicht überlaufen werden.
(Deshalb ist die Lösung mit umkopieren nicht unbedingt die Methode der
Wahl. Man muss viel Aufwand treiben um Fehlbedienung auszuschliessen)