Problem mit zeiger auf zeiger
-
bin gerad dabei eine vereinfachte split-Funktion zu schreiben wie Sie sie in vielen diversern Sprachen gibt (perl, php, (bash)-script...)
als Parameter soll sie den Seperator, den Quellstring und eine zeiger auf eine string bekommen, in dem dann alle Teilstrings enthalten sind (wie bei der main der argv Parameter).
Der Rückgabewert soll die Anzahl der gefunden Teilstring enthalten.Das finden und teilen der einzelnen String klappt auch ganz gut, nur hab ich ein Problem beim "zurück geben" der Teilstings (dem Zeiger auf einen String).
Ich find den Fehler einfach nicht, ich hab's nicht so mit pointer auf pointer.hier die Funktion:
int split( char Sep, char *Source, char *Dest[]) { int count = 0; // Anzahl der gefunden TeilStrings char *buffer = (char*) calloc( lstrlen( Source) + 1, sizeof(char)); // buffer max. so lang wie Source for( int i=0, length=0; i<strlen(Source)+1; i++, length++) { if( Source[i] == Sep || Source[i] == '\0') { i+=1; // damit das Seperator-Zeichen übersprungen wird Dest[count] = (char*) calloc( length + 1, sizeof(char)); // speicher reservieren strncpy( Dest[count], buffer, length); // buffer in Destination kopieren count++; // Anzahl erhöhen length=0; // buffer länge wieder auf 0 setzen memset( buffer, 0, lstrlen( Source) + 1); // buffer inhalt wieder auf null ("") sezten } buffer[length] = Source[i]; // Zeichen in buffer umkopieren umkopieren } return count+1; // Anzahl zurück geben (+1, da bei 0 angefangen wurde zu zählen) }
ein Beispiel wäre:
int main() { char *OrgString = "c:\\Ordner1\\Ordner2\\Ordner3\\file.dat"; char **ziel; int anzahl; anzahl = split( '\\', OrgString, ziel); for( int i=0; i<anzahl; i++) printf("%s\n", ziel[i]); free(ziel); return 0; }
Ausgabe:
c:
Ordner1
Ordner2
Ordner3
file.datwenn mir einer hefen kann, wär ich sehr dankbar.
phillip
-
so läufts
int split( char Sep, char *Source, char *Dest[]) { int count = 0; // Anzahl der gefunden TeilStrings char *buffer = (char*) calloc( lstrlen( Source) + 1, sizeof(char)); // buffer max. so lang wie Source for( int i=0, length=0; i<strlen(Source)+1; i++, length++) { if( Source[i] == Sep || Source[i] == '\0') { i+=1; // damit das Seperator-Zeichen übersprungen wird Dest[count] = (char*) calloc( length + 1, sizeof(char)); // speicher reservieren strncpy( Dest[count], buffer, length); // buffer in Destination kopieren count++; // Anzahl erhöhen length=0; // buffer länge wieder auf 0 setzen memset( buffer, 0, lstrlen( Source) + 1); // buffer inhalt wieder auf null ("") sezten } buffer[length] = Source[i]; // Zeichen in buffer umkopieren umkopieren } return count; // Anzahl zurück geben (+1, da bei 0 angefangen wurde zu zählen) } int main() { char *OrgString = "c:\\Ordner1\\Ordner2\\Ordner3\\file.dat"; char *ziel[1000]; int anzahl; anzahl = split( '\\', OrgString, ziel); for( int i=0; i<anzahl; i++) { printf("%s\n", ziel[i]); free (ziel[i]); } return 0; }
finde die unterschiede
-
danke für die schnelle Antwort.
ja im Prinzip klappts, nur wollt ich gerade das vermeiden, das man von vorn herein angeben muss groß der ziel-String sein soll. Da her wär ein zeiger auf zeiger schön. gibt es noch andere möglichkeiten?
-
Phillip schrieb:
gibt es noch andere möglichkeiten?
die split-funktion kann sich z.b. den speicher selbst anlegen und bei bedarf mit 'realloc' vergrössern. aber freigeben muss immer noch der aufrufer.
-
Schau dir das mal an. Das ist zum Verständnis nicht schlecht:
void giveMem(int **pSpeicher) { int *p; printf("p vorher: %d\n", p); p = new int(100); *pSpeicher = p; printf("p nachher: %d\n", p); for(int i=0; i<100; i++) p[i] = i*i; } int main() { int *pSpeicherbereich; printf("pSpeicherbereich vorher: %d\n", pSpeicherbereich); giveMem(&pSpeicherbereich); printf("pSpeicherbereich nachher: %d\n", pSpeicherbereich); printf("main:\n"); for(int i=0; i<100; i++) printf("%d ", pSpeicherbereich[i]); return 0; }
PS: Ich weiß, dass hier C und C++ vermischt sind ...
-
Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
#include <stdio.h> #include <stdlib.h> #include <string.h> int split (char *src, char sep, char ***dstp) { char **dst,*cp,*end; int num_words; /* anzahl der worte berechnen */ cp=src; num_words=1; while(*cp) if(*cp++==sep) num_words++; /* speicher allozieren */ *dstp=dst=malloc((num_words+1)*sizeof(char*)+strlen(src)+1); strcpy(dst+num_words+1,src); src=dst+num_words+1; /* kopie des strings aufteilen */ end=src+strlen(src); while(src<end) { *dst++=src; while(*src && *src!=sep) src++; *src++='\0'; } *dst=NULL; return num_words; } int main() { char *OrgString = "c:\\Ordner1\\Ordner2\\Ordner3\\file.dat"; char **ziel; int anzahl; anzahl = split( '\\', OrgString, ziel); for( int i=0; i<anzahl; i++) printf("%s\n", ziel[i]); free(ziel); return 0; }
-
Hallo,
da schau dir mal die Funktion strtok an, einfach mal in der Suchmaschine eitippen.