2013-11-05 45 views
0

我試圖通過我的程序來執行一個UNIX命令,它將處理多達4個參數,爲什麼這會產生seg故障或其他錯誤?爲什麼下面的代碼會產生分段錯誤?

using namespace std; 

int main() { 

char buffer[255]; 
cin >> buffer; 


char* firstPtr; 
char* secondPtr; 
char* thirdPtr; 
char* fourthPtr; 

firstPtr = strtok(buffer, " "); 
secondPtr = strtok(NULL, " "); 
thirdPtr = strtok(NULL, " "); 
fourthPtr = strtok(NULL, " "); 


execlp(firstPtr, secondPtr); 


    return 0; 
} 
+0

因爲你調用未定義的行爲? (或者你已經知道)? 'cin >> buffer'正在打破空白,因此在''「'上標記這個是沒有意義的。因此'secondPtr'爲NULL,你快樂地走進UB-land。 – WhozCraig

+0

「或其他錯誤?」哪些其他錯誤? – codeling

+0

當我exec的LS我得到的錯誤是NULL傳遞做argv [0] – Scholar

回答

2

的崩潰是因爲你buffer溢出。

嘗試使用std::cin.getline(buffer, sizeof(buffer))代替std::cin >> buffer
還要注意的是strtok可能返回NULL,所以一定要處理。

+0

他的緩衝區是255個字符,並且這會因'./prog a b'錯誤。 – WhozCraig

+0

@WhozCraig我在我的電腦上試過它,只有當緩衝區溢出時纔會發生崩潰。 – Zaffy

+0

問問自己「當輸入輸入*時,'buffer'具有什麼功能*完全*爲'a b'?這個問題的答案與這個問題有關:「什麼原因導致從std :: istream中提取字符串以及是否停止* ??除此之外,* whitespace *。so'」b「'仍然在流中,'buffer'只保留''a「',現在發送到'strtok()',其餘部分有希望顯而易見 – WhozCraig

1

我認爲你應該使用

char buffer[255]; 
cin.getline(buffer, 255); 

否則你的第二,第三和第四的指針將是空的。

1

如果選中的execlpman page,你會發現,第一個參數(第二個參數的方法,該arg0參數)是強制性的,除了任何其他參數你可能會傳遞給通過可變參數的函數參數 - 並且在文中還提及

參數列表必須以空指針終止。

第一個參數(secondPtr在你的情況)應該是可執行文件的名稱;所以你通過在這裏傳入NULL來違反約定(因爲其他人已經指出了cin >>)。

但除此之外,你還缺少在此必須NULL末至少一個或多個參數。

所以,強烈建議手冊頁的研究!

相關問題