尝试在C中对shell函数使用strtok()
我试图将用户为shell程序输入的命令标记化。程序运行了,但我不认为它正在填充我声明的param数组。我很抱歉,如果我似乎没有一吨的信息,因为我正在学习这作为一个做它,但我不知道为什么它不是填充参数。任何帮助都将不胜感激,如果您需要任何其他信息,请随时询问尝试在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_
#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。还修复了返回问题和内存泄漏问题。返回
正常,不是问题。但它看起来很难看。你不能“修复”内存泄漏,因为你所有的指针都指向那个内存。问题中没有足够的信息来知道问题在哪里。看见