2016-09-20 2 views
-1

Я пытаюсь сделать токенизацию введенных пользователем команд для оболочки. Программа работает, но я не думаю, что она заполняет массив параметров, который я объявил. Мне жаль, если мне кажется, что у меня нет тонны информации, поскольку я изучаю это как это сделать, но я не уверен, почему это не заполняет параметр. Любая помощь была бы признательна, и если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать.Пытается использовать strtok() для функции оболочки в 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

Как вы выделения 'param'? О, и не пишите 'return (param)', 'return' не является funtion. У вас также есть утечка памяти, вам нужно 'free()' 'line'. –

+0

просто добавил следующее: «param», используя _param = malloc (buffer * sizeof (char *)); _ где _buffer = 64; _. также исправлена ​​проблема с возвратом и утечка памяти –

+0

«Возвращение» было нормально, это не проблема. Но это выглядит просто уродливо. –

ответ

-1

что-то вроде этого:

#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; 
} 
Смежные вопросы