Split - auch mit leeren Einträgen



  • Der letzte Versuch is doch schonmal ein guter Start.
    Ist zwar keine so schöne Lösung, aber du kannst doch einfach nen Workaround machen:

    char* tok = strtok(input, delimiter); 
    while (tok != NULL) {
        /* workaround...
         * checks if the previous character is
         * also a delimiter
          */
        if(*(tok-1) == ';') {
            printf("(empty)\n");
        }
        printf("%s\n", tok); 
        tok = strtok(NULL, delimiter); 
    }
    

    das newline im delimiter-array brauchst du eigentlich nich



  • Sind die Maximallängen bekannt ?
    Also, die Anzahl der Zeichen zwischen den Semikolons ?



  • Kuckuck !

    int main ()
    {
    	char Toks[M][N+1]={0}; // +1: Ein Zeichen für die Terminierung spendieren.
    	char* eSmI = "05.05.08 20:59:21;RING;0;;336514;ISDN;"; // Ein String mit Inhalt.
    	int i=0, j=0;
    
    	while( *eSmI )
    	{
    		i=0;
    		while( *eSmI != DELIM )
    		{
    			Toks[j][i++] = *eSmI++;
    		}
    		j++;
    		eSmI++;
    	}
    	i=0;
    	while(i<M)
    		puts( Toks[i++] );
    	return 0;
    }
    

    Aufsplittung in Token, ganz ohne Standardbibliothek. 🕶



  • getnich

    C:\Dokumente und Einstellungen\Administrator\Desktop\test\main.c(4) : error C2065: 'M' : nichtdeklarierter Bezeichner
    C:\Dokumente und Einstellungen\Administrator\Desktop\test\main.c(4) : error C2057: Konstanter Ausdruck erwartet
    C:\Dokumente und Einstellungen\Administrator\Desktop\test\main.c(4) : error C2466: Reservierung eines Feldes der konstanten Groesse 0 nicht moeglich
    C:\Dokumente und Einstellungen\Administrator\Desktop\test\main.c(4) : error C2065: 'N' : nichtdeklarierter Bezeichner
    C:\Dokumente und Einstellungen\Administrator\Desktop\test\main.c(4) : error C2057: Konstanter Ausdruck erwartet
    C:\Dokumente und Einstellungen\Administrator\Desktop\test\main.c(4) : error C2466: Reservierung eines Feldes der konstanten Groesse 0 nicht moeglich
    C:\Dokumente und Einstellungen\Administrator\Desktop\test\main.c(4) : error C2087: '<unbekannt>' : Feldindex fehlt
    C:\Dokumente und Einstellungen\Administrator\Desktop\test\main.c(11) : error C2065: 'DELIM' : nichtdeklarierter Bezeichner
    


  • ähm...Copy & Paste bringt dir keinen Lernerfolg.
    Du musst schon die Konstanten und Bezeichner anpassen...



  • Huch na sowas, hab ich da etwa gepfuscht?

    Ist mir beim Copy & Paste verloren gegangen:

    #define M 6
    #define N 20 
    #define DELIM ';'
    

    Oder wahlweise:

    enum { M = 6, N = 20, DELIM = ';' };
    

    Du musst natürlich aufpassen, das die Zeichenlänge nicht länger als N wird.
    Wenn die maximale Zeichenlänge nicht bekannt ist, muss dynamisch Speicher reserviert werden ( malloc ).

    🙂



  • Hallo Leute,

    danke für eure Antworten. Da ich seit 1,5 Jahrzehnten mit Basic, Perl, PHP & Co "vorbelastet" bin, fällt mir der Einstieg in C nicht ganz so einfach.

    Ich habe jetzt mit dem Beispiel von Big Brother rumgespielt und prinzipiell funktioniert das ganze soweit. Das einzige Problem ist, dass die Rückantworten, die zersplittet werden sollen, unterschiedlich lang sein können.

    Folgende Fälle sind definiert:

    20.10.07 11:47:36;CALL;1;4;879136;06158916142;SIP2;
    20.10.07 11:47:37;RING;2;06158879136;916142;ISDN;
    20.10.07 11:47:48;DISCONNECT;1;0;
    20.10.07 11:47:48;DISCONNECT;2;0;
    20.10.07 14:12:50;CALL;0;4;061582541;06158916142;ISDN
    20.10.07 14:12:57;CONNECT;0;4;061582541;
    20.10.07 14:13:16;DISCONNECT;0;19;
    

    Die Anzahl der Array-Elemente orientiert sich also im Prinzip wenn man so möchte an der Anzahl der Semikolons. Entsprechend müsste das Array "flexibel" generiert werden. Wie genau kann ich den so einen Fall handhaben?

    Damit ich den Code auch verstehen kann (und nicht stupide etwas abtippe):
    Das

    eSmI++;
    

    bedeutet im Prinzip, dass der Zeiger immer einen Buchstaben weiter gesetzt wird und so ein Abgleich der aktuellen Stelle mit dem Trennzeichen stattfinden, richtig?
    Was genau wird mit

    *eSmI++;
    

    bezweckt?

    prodigy7



  • Okay ... hab einfach

    while(i<M)
    

    durch

    while(i<j)
    

    ersetzt - macht das was ich will. Gäbe es irgendwas, was gegen so eine Vorgehensweise sprechen würde?



  • Also irgendwie passt das nicht so ganz... mit der Split-Funktion möchte ich eine Split-Funktion in einem vorhandenen Programm ersetzen, welche nicht so richtig funktioniert hat. Das Splitten geht ja jetzt, nur krieg ich das nicht in das Array rein, wo es rein soll.
    Ich hab die Sourcen mal unter http://download.prodigy7.de/files/sources/listen2fritz-0.6.tar.gz hochgeladen.

    Der Teil, der mir Kopfzerbrechen bereitet, liegt unter src/util in der Datei util.c, Funktion util_splitinput.
    Wenn ich mit den gesplitteten Werten arbeiten will (ins andere Array schieben), landet das in einem Segmentation Fault.



  • prodigy7 schrieb:

    Gäbe es irgendwas, was gegen so eine Vorgehensweise sprechen würde?

    ja. i darf nicht größer M werden.


Anmelden zum Antworten