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).


Anmelden zum Antworten