尝试在C中对shell函数使用strtok()

尝试在C中对shell函数使用strtok(),c,arrays,shell,strtok,stringtokenizer,C,Arrays,Shell,Strtok,Stringtokenizer,我试图将用户为shell程序输入的命令标记化。程序运行了,但我不认为它正在填充我声明的param数组。我很抱歉,如果我似乎没有一吨的信息,因为我正在学习这作为一个做它,但我不知道为什么它不是填充参数。任何帮助都将不胜感激,如果您需要任何其他信息,请随时询问 #include "HeaderFile.h" #include <stdio.h> #include <stdlib.h> #define token_delimiter " \n\r" char **shell_

我试图将用户为shell程序输入的命令标记化。程序运行了,但我不认为它正在填充我声明的param数组。我很抱歉,如果我似乎没有一吨的信息,因为我正在学习这作为一个做它,但我不知道为什么它不是填充参数。任何帮助都将不胜感激,如果您需要任何其他信息,请随时询问

#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);
}
#包括“HeaderFile.h”
#包括
#包括
#定义标记\u分隔符“\n\r”
字符**外壳读取(字符*行,字符**参数){
行=空;
ssize_t size=0;
getline(&line,&size,标准尺寸);
//printf(“%s”,第行);
int i=0;
字符*行标记;
行\标记=strtok(行,标记\分隔符);
printf(“%s”,第_行标记);
对于(i=1;行_标记!=NULL;i++){
param[i]=行_令牌;
行标记=strtok(空,标记分隔符);
}
参数[0]=NULL;
返回(参数);
}
类似这样的内容:

#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;
}
#包括
#包括
#包括
#定义标记\u分隔符“\n\r”
char**shell\u read(void){//参数不是必需的。因为它们是在此函数中生成的。
char*line=NULL;
大小\u t大小=0;
西泽特伦;
if(-1==(len=getline(&line,&size,stdin))){
自由线;
返回NULL;
}
char**param=malloc(sizeof(*param)*((len+1)/2+1));//最后一个+1表示NULL
int i=0;
char*line\u token=strtok(行,token\u分隔符);
while(行标记!=NULL){
param[i++]=strdup(line_token);//需要分配和复制
行标记=strtok(空,标记分隔符);
}
参数[i]=NULL;
自由线;
返回参数;
}
内部主(空){
putchar('>');fflush(stdout);
char**tokens=shell_read();
如果(代币){
for(字符**令牌=令牌;*令牌;++令牌){
看跌期权(*代币);
免费(*代币);
}
免费(代币);
}
返回0;
}

您如何分配
参数
?哦,不要写
return(param)
return
不是函数。您还存在内存泄漏,需要
free()
line
。只需添加以下内容来分配“param”,使用param=malloc(buffer*sizeof(char*));其中buffer=64。还修复了返回问题和内存泄漏问题。
返回
正常,不是问题。但它看起来很难看。你不能“修复”内存泄漏,因为你所有的指针都指向那个内存。问题中没有足够的信息来知道问题在哪里。看见