char array nach char *
-
diese funktion soll z.b.
argv[0] = cd
argv[1] = ..
bauen, in abhängigkeit was getword zurück gibt
das ist aber nicht das problem
ich sitze hier schon seit stunden und frage mich wie ich ein array nach *argv bekommevoid parse(char **argv) { char result[256]; int size; while(0 < (size = getword(result))){ *(argv++) = result; //?!?!?! } *argv = '\0'; }
-
Arrays haben in C keine Kopiersemantik. Du musst für dein *argv irgendwo Speicher herholen (malloc) und dann alle Elemente einzeln kopieren (z.B. strncpy oder memcpy).
-
Also etwas in der Art:
void parse(char **argv) { char result[256]; int size; while( 0 < (size = getword(result)) ){ strcpy( malloc(*argv,size+1) , result ); ++argv; } *argv=0; }
-
malloc nimmt nur ein argument
wenn dann musste sowas machenstrcpy( *argv=malloc(size+1) , result );
Und selbst das ist keine gute idee weil man _immer_ den Rückgabewert von malloc überprüfen sollte (malloc gibt NULL zurück wenn es keinen Speicher reservieren konnte)
-
golden_jubilee schrieb:
diese funktion soll z.b.
argv[0] = cd
argv[1] = ..
bauen, ...... char** argv = malloc(n*sizeof(char**)); if( NULL == argv ) return 0; // Wenn Read-Only-Speicher genügt. argv[0] = "cd"; argv[1] = ... argv[n-1] = " // Wenn die Möglichkeit bestehen soll, die Elemente zu ändern/beschreiben. argv[0] = malloc(strlen("cd")+1); if( NULL != arv[0] ) strcpy(argv[0], "cd"); argv[1] = malloc ... ... argv[n-1] =
Gruß,
B.B.
-
verwendets doch strdup und wenn das nicht verfügabr ist dann schreibst sie dir eben selbst.
-
muss natürlich so heissen, kleiner Lapsus:
void parse(char **argv) { char result[256]; int size; while( 0 < (size = getword(result)) ){ strcpy( *argv=malloc(size+1) , result ); ++argv; } *argv=0; }
Setzt auch voraus, dass der Speicher für argv selbst schon allokiert ist.
strdup ist kein ANSI C.
-
Wutz schrieb:
muss natürlich so heissen, kleiner Lapsus:
void parse(char **argv) { char result[256]; int size; while( 0 < (size = getword(result)) ){ strcpy( *argv=malloc(size+1) , result ); ++argv; } *argv=0; }
Setzt auch voraus, dass der Speicher für argv selbst schon allokiert ist.
strdup ist kein ANSI C.das funktioniert gut
danke
(c ist soooo anstrengend...)
-
Auf die Gefahr hin mich zu wiederholen aber das programm schmiert bei Speichermangel sofort mit nem segmentation fault ab.
lieber das hier/*...*/ if(!(*argv=malloc(size+1)) care_about_error(); strcpy(*argv, result ); ++argv;
man könnte auch noch das ++argv in das strcpy reinziehen also so dann
strcpy(*argv++,result);