Dynamischen langen String Parsen

Davicito

Erfahrenes Mitglied
Hallo, ich brauche mal einen Rat, wie ich aus einem dynamisch langem String parsen kann.

Nehmen wir an, ich habe einen String namens "string" in denen Wörter, Zahlen stehen, die durch Leerzeichen getrennt sind. Ich würde gerne diesen String bis zum ersten Leerzeichen auslesen und das Wort vor dem ersten Leerzeichen in eine gesonderte Stringvariable "string2" einfügen.

Mein Problem dabei ist, dass ich mit sscanf nicht arbeiten kann, da der Inhalt in "string" immer unterschiedlich lang ist.

kann man die sscanf-Funktion anders umbauen als:

C:
node * anhaengen(node* list, void* neuer_String)
{
...
            char* string2 = NULL;
            char* string = (char*) aktl_Elem -> content;

            sscanf(string, "%s...",string2);

            if(strcasecmp((char*) neuer_String, string2) == 0)
			{
...

oder gibt es da eine noch bessere Funktion, die mir nur das erste Wort meines dynamischen Strings liefert?

Später habe ich angedacht, dass mir die sscanf-Funktion auch alle vorkommenden Wörter und Zahlen liefern soll. aber für einen Vergleich mit strcasecmp ist mir das erste Wort gerad am wichtigsten.

Liebe Grüße.
 
Zuletzt bearbeitet:
Mein Problem dabei ist, dass ich mit sscanf nicht arbeiten kann, da der Inhalt in "string" immer unterschiedlich lang ist.

Den Zusammenhang musst du mir aber jetzt erklären. Sieh mal was in der Referenz zu sscanf und %s steht:
%s String of characters. This will read subsequent characters until a whitespace is found (whitespace characters are considered to be blank, newline and tab).
 
HI, was verstehst Du denn nicht?

Wo der Zusammenhang zwischen variabler Stringlänge und Nichtfunktionieren von sscanf ist.

Ich kann nur nochmals aus der Referenz zitieren:
%s String of characters. This will read subsequent characters until a whitespace is found (whitespace characters are considered to be blank, newline and tab).

->
C:
const char* string1 = "Warum geht das nicht?";
char string2[255];
sscanf(string1, "%s", string2);
-> string2 == "Warum"
 
Hallo,

ich sehe keinen Grund, wieso du hier eine Kopie anlegen müsstest. Mach es doch z.B. so:
C:
char* firstSpace = strchrnul(string, ' ');
int firstWordLength = firstSpace - string;
  
if (firstWordLength == strlen(neuer_String) &&
    strncasecmp(neuer_String, string, firstWordLength) == 0) {
  ...
}

Grüße,
Matthias

\edit:

-> string2 == "Warum"
Du meinst wohl strcmp(string2, "Warum") == 0 ;-]
 
Zuletzt bearbeitet:
Hi

deine Verwendung von sscanf wäre schon richtig (bis auf "..."), die Funktion hat auch überhaupt kein Problem mit variablen Stringlängen. Das Problem ist, dass du die Länge des ersten Wortes zuerst wissen musst, um genügend Speicher zu reservieren.

C++:
int i = 0;
while(string[i] != '\0' && string[i] != ' ' && string[i] != '\t' && string[i] != '\n' && string[i] != '\r') i++;
string2 = (char*) malloc( ++i );

sscanf(string, "%s", string2);

Gruß

PS: Wa, wie lang hab ich jetzt gebraucht?
 
Zuletzt bearbeitet:
:offtopic:
C++:
int i=0;
while(string[i]&&string[i]!=32&&string[i]!=8&&string[i]!=10&&string[i]!=13)i++;
string2=(char*)malloc(++i);

sscanf(string, "%s",string2);
Nichts für ungut, aber es ist schon bemerkenswert, wie unleserlich du deinen C-Code formulierst und formatierst. Mal ab und zu ein strukturierendes Leerzeichen setzen ist nicht verboten. Und wieso verwendest du Zahlen als magische Konstanten (32, 8, 10, 13...), wenn du doch genauso gut (und viel verständlicher!) die jeweiligen Zeichenkonstanten schreiben könntest? Dann wäre dir nämlich auch nicht der Fehler passiert, dass du statt dem Tabulatorzeichen ('\t' == 9) das Backspacezeichen ('\b' == 8) abtestest. Mal abgesehen davon, dass es auch noch die Funktion isspace gibt.

Wie gesagt, nichts für ungut, aber mir ist das jetzt schon öfters aufgefallen, dass dein Code oft nur sehr schwer lesbar ist. Musste das einfach mal loswerden.

Zum Algorithmus an sich ist noch zu sagen, dass man statt sscanf genauso gut strncpy verwenden könnte, wenn man die Länge des Wortes sowieso schon kennt.

Grüße,
Matthias
 
Wo der Zusammenhang zwischen variabler Stringlänge und Nichtfunktionieren von sscanf ist.

Schau mal... der String beihaltet immer mal mehr Wörter oder Zahlen und mal weniger. Diese sind durch ein Blank von einander getrennt. Wenn ich jetzt also mit sscanf arbeiten möchte, muss ich von vorn herein wissen, wie lang mein String ist. Sprich das geht nur, wenn mein String immer eine constant Anzahl von Wörtern bzw. Zahlen besitzt.
hatte oben in meinem Code nur mal gezeigt, wie ich das angedacht hatte.

in der Referenz steht auch nur, dass bei %s bis zu einem Whitespace gelesen wird. Welches in meinem fall gut wäre, da ich ja das erste Wort bis zum Whitespace aus meinem String lesen möchte. aber dies ist halt nicht der Fall. Wenn ich das Ergebnis mit printf lese, wird gar nichts aus gegeben.

Matthias Reitinger hat mich auf Anhieb verstanden was ich eigentlich wollte. Dennoch finde ich seine Lösung nicht gerade die Beste!! wollte schon irgentwie mit der Funktion sscanf arbeiten, aber in der Referenz steht ebend nicht drin, wie ich mit variable langen Strings - ich sags nochmal - die eine verschiedene Wortanzahl haben können, nur das erste Wort isolieren kann, um dieses für einen Vergleich mit strcasecmp verwenden kann.

Liebe Grüße.

PS. weil ich die letzten 2 Berichte erst später gelesen habe, das Erste Wort, welches ich abfangen möchte, ist auch immer unterschiedlich lang. D.H. strncpy kommt nicht in Frage!
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück