Frage zum Parsen



  • knivil schrieb:

    Wenn man Gesamtinfo veraendern darf, so kann das erste Komma durch 0 ersetzt werden. Danach wird pOut1 auf den Anfang des Strings gesetzt und pOut2 auf den Rest nach dem Komma.

    sowas brauchts aber nicht selbst zu programmieren, das macht 'strtok' schon.
    🙂



  • ;fricky schrieb:

    sowas brauchts aber nicht selbst zu programmieren, das macht 'strtok' schon.
    🙂

    Wenn nicht mal sscanf funktioniert ... auch ist es eine simple for-Schleife.



  • knivil schrieb:

    Wenn man Gesamtinfo veraendern darf, so kann das erste Komma durch 0 ersetzt werden. Danach wird pOut1 auf den Anfang des Strings gesetzt und pOut2 auf den Rest nach dem Komma. Danach kann der so gewonnene String an andere Funktionen weitergegeben werden und man spart sich unnoetige malloc's. Der Speicher an sich kann aber nur ueber GesamtInfo wieder freigegeben werden.

    Jepp, so hast du aber immer nur einen gesplitteten String verfügbar; es mag aber auch Fälle geben, in denen man mehr als einen benötigt.



  • knivil schrieb:

    Wenn nicht mal sscanf funktioniert ... auch ist es eine simple for-Schleife.

    sscanf ist wahrscheinlich deshalb nicht verfügbar, weil da eine ziemlich dicke Maschinerie zum Parsen von ganzen und gebrochenen Zahlen in diversen Formaten drin steckt, die bei einem µC unnötig viel Platz wegnimmt. Über andere Libraryfunktionen wie strtok sagt das nichts aus.



  • Das ist korrekt. Ich habe extrapoliert ...



  • Wie wärs mit einer schnuckeligen Splitfunktion, guckst du hier Bruder:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char** arr_free ( char** arr, int n )
    {
    	if ( !arr )
    		return NULL;
    	while ( --n >= 0 )
    		free ( arr[n] );
    	free (arr);
    	return NULL;
    }
    
    char** arr_addstr ( char** arr, int* n, char* p, int len  )
    {
    	if ( NULL == ( arr = realloc ( arr, ( *n + 1 ) * sizeof ( char** ))))
    			return arr_free ( arr, *n );
    	if ( NULL == ( arr[*n] = malloc ( len + 1 )))
    			return arr_free ( arr, *n );
    	strncpy ( arr[*n], p, len );
    	arr[*n][len] = 0;
    	(*n)++;
    	return arr;
    }
    
    char** splitt0r ( char* s, int* n, char* separators )
    {
    	char** splitted = NULL;
    	char* p = s, *r = separators;
    	*n = 0;
    	if ( p == NULL )
    		return NULL;
    	while (*s)
    	{
    		r = separators;
    		while (*r)
    		{
    			if ( *r == *s )
    				break;
    			r++;
    		}
    
    		if ( *r == *s )
    		{
    			if ( NULL == ( splitted =  arr_addstr( splitted, n, p, s-p )))
    				return NULL;
    			p = s+1;
    		}
    		s++;
    	}
    
    	if ( p != s )
    	{
    		if ( NULL == ( splitted = arr_addstr ( splitted, n, p, s-p )))
    				return arr_free (splitted, *n);
    	}
    
    	return splitted;
    }
    
    void kuggi ( char** arr, int n )
    {
    	if ( !arr )
    		return;
    	while ( --n >= 0 )
    		printf ("%s\n", arr[n]);
    }
    
    int main() 
    { 
    	char* to_split = "I,wanna;be*splitted'0r&what?!";
    	char* seps = ",;*'&";
    	char** arr;
    	int n = 0;
    
    	arr = splitt0r ( to_split, &n, seps );
    	kuggi (arr, n);
    	arr_free (arr, n);
    
    	return 0;
    }
    

    Gru-huß,
    f.m.r.b.



  • frag mich ruhig, bruder schrieb:

    ...
    char** arr_addstr ( char** arr, int* n, char* p, int len  )
    {
    	if ( NULL == ( arr = realloc ( arr, ( *n + 1 ) * sizeof ( char** ))))
    			return arr_free ( arr, *n );
    ...
    

    Wenn der Speicher frei werden soll, brauchst du ne zweite Variable, denn falls realloc NULL liefern sollte, geht die Adresse flöten:

    char** arr_addstr ( char** arr, int* n, char* p, int len  ) 
    	{  
    		char** pp; // <-- Guckst du hier, Bruder.
    		if ( NULL == ( pp = realloc ( arr, ( *n + 1 ) * sizeof ( char** )))) 
                return arr_free ( arr, *n ); 
    		else
    			arr = pp;
    


  • sacht mal leute was soll die ganze scheiße mit den 0's in den nicks und dem code seid ihr 1337 oder was



  • goodquestion schrieb:

    sacht mal leute was soll die ganze scheiße mit den 0's in den nicks und dem code seid ihr 1337 oder was

    nein brud0r :p



  • Bashar schrieb:

    sscanf ist wahrscheinlich deshalb nicht verfügbar, weil da eine ziemlich dicke Maschinerie zum Parsen von ganzen und gebrochenen Zahlen in diversen Formaten drin steckt, die bei einem µC unnötig viel Platz wegnimmt. Über andere Libraryfunktionen wie strtok sagt das nichts aus.

    Das wirds wahrscheinlich sein.

    Ich beschreibe den µC mit AVR-Studio und das zeigt beim Kompilieren die Auslastung des µC.

    Und sobals ich sscanf benutzt hab, schoss diese schlagartig hoch und auch wenn sie nicht 100% erreichte, hat der µC im betrieb schon i-welche Fehler gemacht. Und ich musste ja noch andere Sachen draufpacken.


Anmelden zum Antworten