2016-09-20 2 views
-1

J'essaie de mettre en évidence les commandes entrées par l'utilisateur pour un programme shell. Le programme s'exécute mais je ne pense pas qu'il remplisse le tableau param que j'ai déclaré. Je suis désolé s'il semble que je n'ai pas une tonne d'informations car j'apprends ceci comme un do, mais je ne suis pas sûr pourquoi il ne remplit pas param. Toute aide serait reconnaissante et si vous avez besoin d'informations supplémentaires s'il vous plaît n'hésitez pas à demander.Tentative d'utilisation de strtok() pour une fonction shell dans C

#include "HeaderFile.h" 
#include <stdio.h> 
#include <stdlib.h> 
#define token_delimiter " \n\r" 

char **shell_read(char *line, char **param){ 

    line = NULL; 
    ssize_t size = 0; 
    getline(&line, &size, stdin); 
    //printf("%s", line); 
    int i = 0; 
    char *line_token; 
    line_token = strtok(line, token_delimiter); 
    printf("%s", line_token); 
    for(i=1; line_token!=NULL; i++){ 
     param[i] = line_token; 
     line_token = strtok(NULL, token_delimiter); 

    } 
    param[0] = NULL; 
    return(param); 
} 
+0

Comment allouent vous 'param'? Oh, et n'écrivez pas 'return (param)', 'return' n'est pas une fonction. Vous avez également une fuite de mémoire, vous devez 'free()' 'line'. –

+0

vient d'ajouter ce qui suit pour allouer 'param', en utilisant _param = malloc (buffer * sizeof (char *)); _ où _buffer = 64; _. également corrigé le problème de retour et la fuite de mémoire –

+0

La chose 'return' était ok, ce n'est pas un problème. Mais ça a l'air moche. –

Répondre

-1

quelque chose comme ceci:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define token_delimiter " \n\r" 

char **shell_read(void){//Parameters are not necessary. because they are made in this function. 
    char *line = NULL; 
    size_t size = 0; 
    ssize_t len; 
    if(-1 == (len = getline(&line, &size, stdin))){ 
     free(line); 
     return NULL; 
    } 

    char **param = malloc(sizeof(*param) * ((len + 1)/2 + 1));//last +1 for NULL 
    int i = 0; 
    char *line_token = strtok(line, token_delimiter); 

    while(line_token != NULL){ 
     param[i++] = strdup(line_token);//need allocate and copy 
     line_token = strtok(NULL, token_delimiter); 
    } 
    param[i] = NULL; 
    free(line); 

    return param; 
} 

int main(void){ 
    putchar('>');fflush(stdout); 

    char **tokens = shell_read(); 
    if(tokens){ 
     for(char **token = tokens; *token; ++token){ 
      puts(*token); 
      free(*token); 
     } 
     free(tokens); 
    } 
    return 0; 
}