[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