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 bekomme

    void  parse(char **argv)
    {
    
    	char result[256];
    	int size;
    
    	while(0 < (size = getword(result))){
    
    				*(argv++) =  result; //?!?!?!
    
    	}
    		*argv = '\0'; 
    
    }
    

  • Mod

    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 machen

    strcpy( *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);
    

Anmelden zum Antworten