2013-11-05 122 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末至少一个或多个参数。

所以,强烈建议手册页的研究!

相关问题