我尝试创建Linux shell并遇到问题,我读取用户输入,将其存储在字符串数组中,对其进行标记,以及我所拥有的任何条件args [0]永远不会成立。这是代码
void shell_loop(void)
{
char *line;
char **args;
int status;
do
{
printf("%s","sh1>");
line=read_line();
args=parse_line(line);
status=execute_arguements(args);
} while(status);
}
char * read_line(void)
{
char * line=NULL;
int bufferSize=MAX_SIZE;
getline(&line,&bufferSize,stdin);
return line;
}
char ** parse_line(char * line)
{
int position=0;
char ** tokens=malloc(MAX_SIZE*sizeof(char*));
char * token;
if(!tokens)
{
fprintf(stderr,"failed to allocate memory\n");
exit(EXIT_FAILURE);
}
token=strtok(line," ");
while (token != NULL) {
tokens[position] = token;
position++;
token=strtok(NULL," ");
}
tokens[position] = NULL;
return tokens;
}
int execute_arguements(char ** args)
{
if (args[0] == NULL)
{
return 1;
}
printf("%s\n",args[0]);
if(args[0]=="exit" || args[0]=="^D")
{
exit(EXIT_FAILURE);
}
return 1;
}
无论我在if语句中写什么条件它都不起作用,例如,如果我写exit或Ctrl + D没有任何反应,因为if永远不会成立。如果我只按enter args [0] == NULL为false,如果我按退出args [0] =="退出"即使是prinf也是假的("%s",args [0])打印退出例如。有人知道为什么会这样吗?提前致谢
答案 0 :(得分:1)
我从评论中看到,您已经将user3121023的建议用于strcmp()
而不是'=='进行字符串比较。这是第一个问题。
您无法通过与control-D
进行比较来测试输入结束。 Control-D
是用户可以(根据选项)在输入上发出文件结束信号的方式。但是这个角色并没有作为输入的一部分传达;而是关闭输入流。相反,您需要在getline()
的调用中检查文件结尾,并相应地重新构建其余部分。
最有可能的原因strcmp()
不匹配是因为getline
返回的输入以换行符结尾。您的read_line()
函数可能应该从行尾删除任何换行符。