在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的?

任何帮助表示赞赏,谢谢:)

+1

您是否尝试添加一些调试输出以查看它在哪条线路上崩溃? – EkcenierK

+1

看起来你正在'目录'上做一个strtok,然后使用'dir'作为chdir命令 - 这是故意的吗? 此外,strtok中的输出在第一次迭代时将为“cd”,您需要再次使用'NULL'作为字符串输入来调用strtok以获取下一个分隔字符串。 – NadavL

+1

如果你的程序崩溃了,你应该在调试器中运行它来捕捉崩溃。这会告诉你哪里崩溃,让你检查函数调用堆栈,甚至让你走上调用堆栈,以便你能够得到你的代码(如果调试器已经不停止)。当您在代码中找到崩溃时,您可以检查变量的值以帮助您找出可能导致崩溃的原因。如果你仍然无法弄清楚,那就更新你的问题,告诉我们崩溃的位置以及所有涉及变量的值。 –

char *directory = strtok(cmd," "); 

应该

 char *directory = strtok(NULL," "); 

当你打电话strtok()获得下一个道理,你传递NULL它。并且,strtok()不可重入。所以即使您的计划要标记不同的字符串,您也无法使用它。您可以在POSIX系统上使用strtok_r()