Probleme beim Anfängen an String
-
Hi, hier erstmal der Code:
void Teilen() //Umwandeln der Strings { char *sTeilung; char sBuffer[255]=" "; char *sKlammer; char cZwischenspeicher; int iLaenge; int i; sTeilung=strtok(Struktur.sElemente[0], " ()");//Erster Teil, <!ELEMENT sTeilung=strtok(NULL, " ()");//Zweiter Teil iLaenge=strlen(sTeilung); //Laenge vom 2. String-Teil strncat(sBuffer, sTeilung, iLaenge);//String in sBuffer ohne \0 schreiben strcat(sBuffer, " ");//Leerzeichen anfügen sKlammer=strtok(NULL, "()");//Kompletten Inhalt der Klammer in einen String printf("Klammer=|%s|\n", sKlammer);//Testausgabe for(i=0;i<20;i++) { if(sKlammer[i]!=',') { printf("K:%c\n", sKlammer[0]);//Testausgabe cZwischenspeicher=sKlammer[i];//cZwischensp. kriegt den aktuellen Nicht-,-Buchstaben strcat(sBuffer, cZwischenspeicher);//Anfuegen des einen Zeichens an sBuffer } } printf("sBuffer=|%s|\n", sBuffer);//Testausgabe }
So, main ruft eine andere Funktion noch auf, aber die geht ohne Probleme.
In Struktur.sElemente[0] steht: <!ELEMENT abteilung (name, angehoerige)>Nun will ich da folgenden String draus: abteilung name angehoerige
Problem ist aber das Komma, da ich das mit strtok net lösen kann, würde ich als Kriterium " (,,,)" oder so schreiben, da es auch Zeilen mit oder ohne Kommas gibt, macht er net mehr mit, daher das obere. Denn wenn nur 1 Komma drin ist, würde er bis zum nächsten suchen und am Zeilenende aufhören, was mir nix bringt
Leider macht strcat das mit dem einen Zeichen nicht mit, aber er muss ja zwingend das in der cZwischenspeicher da anfügen!Wie kann ich das lösen?
-
Nimm doch sscanf():
#include <stdio.h> // <!ELEMENT abteilung (name, angehoerige)> const char* s = "<!ELEMENT abteilung (name, angehoerige)>"; char str1[100], str2[100], str3[100]; if ( sscanf( s, "<!ELEMENT %s (%s, %s)>", str1, str2, str3 ) == 3 ) { // ok printf( "str1 = '%s', str2 = '%s', str3 = '%s'\n", str1, str2, str3 ); }
-
Das Problem ist ja, es sind mal 2 Wörter in der Klammer, mal 4, mal nur eins, das ist es ja.
-
#include <stdio.h> // <!ELEMENT abteilung (name, angehoerige)> const char* s = "<!ELEMENT abteilung (alpha, beta, gamma, delta)>"; char str1[100], str2[100]; if ( sscanf( s, "<!ELEMENT %s (%[^)])>", str1, str2 ) == 2 ) { // ok, str1 enthaelt "abteilung", str2 enthaelt "alpha, beta, gamma, delta" char str3[100], str4[100], str5[100], str6[100]; int n = sscanf( str2, "%s, %s, %s, %s", str3, str4, str5, str6 ); if ( n < 4 ) str6[0] = '\0'; if ( n < 3 ) str5[0] = '\0'; if ( n < 2 ) str4[0] = '\0'; if ( n < 1 ) str3[0] = '\0'; printf( "str1 = '%s', str3 = '%s', str4 = '%s', str5 = '%s', str6 = '%s'\n", str1, str3, str4, str5, str6 ); }
-
So wie ich deine Antwort jetzt interpretiere, geht sie NUR, wenn da 4 Worte inner Klammer sind. Ok, war etwas ungenau, ich les da Zeilenweise, also dass aus
sTeilung=strtok(Struktur.sElemente[0], " ()");
das alles ne Schleife wird und da statt [0] ne Zählvarable ist.
Im ganzen also ne Schleife, wo dann ebend in der Klammer z.b. 2 Worte, mal 1, mal 3, mal 2 sind.
Bei mir würde das ja gehen, aber der macht es mit strcat nicht und deine Version ist wie ich mir denke immer "fest", d.h. es müssten immer 4 Worte sein.
-
sscanf() liefert die Anzahl der Felder, die erfolgreich gematcht wurden. In Zeile 8-12 meines Beispiels zeige ich, wie man sscanf() dazu benutzen kann, eine variable Anzahl von Feldern zu lesen.
-
Ah ok, habs jetzt etwas mehr verstanden, jedoch:
n liefert immer 1 zurück, er gibt bei mir nie mehr aus, quasi schreibt nur das erste Wort in der Klammer, alpha, in Variable str3. Warum aber den Rest nicht? Was macht eigentlich %[^)]? Denn str2 kann ich nicht ausgeben lassen mit printf!Denn in deinem 2. Beispiel sollten sicher alle 5 Strings, str1, str3-6 richtig ausgegeben werden und nur, wenn ich z.b. delta wegnehme, dann sollte die str6 nicht mehr da sein, bedingt durch das if ( n < 4 ) str6[0] = '\0';
Aber er gibt ja nur die ersten beiden aus..?
-
Diamond schrieb:
Ah ok, habs jetzt etwas mehr verstanden, jedoch:
n liefert immer 1 zurück, er gibt bei mir nie mehr aus, quasi schreibt nur das erste Wort in der Klammer, alpha, in Variable str3. Warum aber den Rest nicht?Probier mal
"%[^,],%[^,],%[^,],%[^,]"
als Pattern (dann werden die Kommas ignoriert). Mein Fehler!
Diamond schrieb:
Was macht eigentlich %[^)]?
Liest alle Zeichen ausser ")" ein einen Puffer.
Diamond schrieb:
Denn str2 kann ich nicht ausgeben lassen mit printf!
Wenn, dann musst Du die Ausgabe in die IF-Anweisung reinmachen (damit was im Puffer drinsteht).