2015-12-15 93 views
0

我正在寫一個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

如果你的程序崩潰了,你應該在調試器中運行它來捕捉崩潰。這會告訴你哪裏崩潰,讓你檢查函數調用堆棧,甚至讓你走上調用堆棧,以便你能夠得到你的代碼(如果調試器已經不停止)。當您在代碼中找到崩潰時,您可以檢查變量的值以幫助您找出可能導致崩潰的原因。如果你仍然無法弄清楚,那就更新你的問題,告訴我們崩潰的位置以及所有涉及變量的值。 –

回答

1

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

應該

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

當你打電話strtok()獲得下一個道理,你傳遞NULL它。並且,strtok()不可重入。所以即使您的計劃要標記不同的字符串,您也無法使用它。您可以在POSIX系統上使用strtok_r()

相關問題