[solved] Problem mit Zeigern beim String splitten.



  • Hallo Community,

    Ich habe hier das folgende Programm, mit diesem möchte ich einen String auf Zeichen untersuchen und unter bestimmten Umständen den String an dieser Stelle "abschneiden" und das abgeschnittene Stück zurückgeben.

    /* includes */
    #include <stdio.h>
    #include <string.h>
    
    char *splitstrat( char *source, char *pattern );
    
    /* main */
    int main( const int argc, const char *argv[] ) {
    
    	printf( "token test!\n\n");
    
    	char str1[] = "test1\r\ntest2\r\ntest3\r\ntest4\r\ntest5\r\n";
    	char str2[] = "a1\r\nb2\r\nc3\r\nd4\r\ne5\r\n";
    
    	char *pCh = 0;
    
    	pCh = splitstrat( str1, "\r\n" );
    	while( pCh != NULL ) {
    
    		printf( "%s", pCh );
    		pCh = splitstrat( NULL, "\r\n" );	
    	}
    
    	printf( "\n\ntest done!\n" );
    
    	return 0;
    }
    
    char *splitstrat( char *source, char *pattern ) {
    
    	/* pattern must be specified */
    	if( pattern == NULL )
    		return 0;
    
    	/* save the last position of last source */
    	static char* szLastSource = 0;
    
    	/* match state */
    	char *state = pattern;
    
    	/* length of substring */
    	int iLen = 0;
    
    	/* if source is null use last source, else set up new static values */
    	if( source != NULL )
    		szLastSource 	= source;
    
    	/* step through the string until a pattern matches or the null terminating symbol is reached */
    	while( szLastSource != '\0' ) {
    
    		/* the whole pattern matched */
    		if( *state == '\0' ) {
    
    			/* get substring */
    			char *sub = new char[ iLen + 1 ];
    
    			/* copy string */
    			strncpy( sub, szLastSource, iLen );
    
    			/* attach null terminating symbol */
    			sub[ iLen ] = '\0';
    
    			/* set new start of szLastSource after the pattern */
    			szLastSource = ( szLastSource + iLen );
    
    			/* return substring */
    			return sub;
    		}
    
    		/* chck if current pattern symbol matches */
    		if( *state == *( szLastSource + iLen ) ) {
    
    			/* increment pattern state */
    			state = (state + 1);
    		}
    		/* does not match */
    		else {
    
    			/* reset pattern state */
    			state = pattern;
    		}
    
    		/* increment length */
    		iLen++;
    	}
    
    	printf( "tessssstttt...\n" ); // <-- wird nie erricht
    	/* clear pointer of last source */
    	szLastSource = 0;
    
    	return 0;
    }
    

    Dies spiltstrat Funktion sollte eigentlich fast so wie die strtok Funktion aus der C Library string.h arbeiten.

    Ok und das Problem was ich jetzt habe ist, dass sich das Problem immer mit einem Runtime-Error verabschiedet. Die Ausgabe in der Konsole ist:

    ...
    test1
    test2
    test3
    test4
    test5
    b2
    c3
    d5
    e5
    <error>
    

    Ich denke mal ich habe bei der Zeigerarithmetik irgendwo ein Fehler drine?.
    Es wäre nett, wenn sich mal jemand das Stück Code ansieht und mir evtl. erklären kann wo der Fehler liegt.

    Danke.

    Lg Tobi



  • Erste Frage: In welcher Sprache programmierst du?

    Zweite Frage: Um welche Sprache geht es in diesem Unterforum?

    zu deinem Problem: Wahrscheinlich ist deine Abbruchbedingung falsch und die Ausgabe mit "a1", "b2" etc. kommt nur, weil bei dir die beiden Strings zufällig hintereinander im Speicher stehen.



  • Hehe, ok also ich hab ihn jetzt doch selbst gefunden. Der Fehler lag in der While-Loop, dort habe ich statt den Wert von szLastSource, die Adresse verglichen.

    [cpp]
    /* ... */
    while( *****szLastSource != '\0' ) {
    /* ... */
    [/cpp]

    Lg Tobi


Log in to reply