在C中创建一个shell,但不能让chdir工作?
问题描述:
我正在写一个C的shell,它应该实现几个命令,其中之一是更改目录命令。要改变目录,我使用chdir(),但每次运行代码时,都会出现分段错误(核心转储)错误。 这里是我的代码:在C中创建一个shell,但不能让chdir工作?
.....
........
char *shell;
while((shell=readline("shell> "))){
char *cmd = strtok(shell," ");
if(strcmp(cmd,"ls")==0)
{
//do something
}
else if(strcmp(cmd,"print")==0)
{
//do something
}
else if(strcmp(cmd,"cd")==0){
char *directory = strtok(NULL," ");
if(chdir(directory)==-1){
printf("Error\n");
}
else
{
printf("changed directories!");
}
}
add_history(shell);
}
我想我可能会错误地使用strtok的?
任何帮助表示赞赏,谢谢:)
答
这
char *directory = strtok(cmd," ");
应该
char *directory = strtok(NULL," ");
当你打电话strtok()
获得下一个道理,你传递NULL
它。并且,strtok()
不可重入。所以即使您的计划要标记不同的字符串,您也无法使用它。您可以在POSIX系统上使用strtok_r()
。
您是否尝试添加一些调试输出以查看它在哪条线路上崩溃? – EkcenierK
看起来你正在'目录'上做一个strtok,然后使用'dir'作为chdir命令 - 这是故意的吗? 此外,strtok中的输出在第一次迭代时将为“cd”,您需要再次使用'NULL'作为字符串输入来调用strtok以获取下一个分隔字符串。 – NadavL
如果你的程序崩溃了,你应该在调试器中运行它来捕捉崩溃。这会告诉你哪里崩溃,让你检查函数调用堆栈,甚至让你走上调用堆栈,以便你能够得到你的代码(如果调试器已经不停止)。当您在代码中找到崩溃时,您可以检查变量的值以帮助您找出可能导致崩溃的原因。如果你仍然无法弄清楚,那就更新你的问题,告诉我们崩溃的位置以及所有涉及变量的值。 –