C++ C++;将execvp与字符串数组一起使用
我正在编写一个程序来执行带有任意数量参数的Unix命令。由于我使用常规字符串,所以接收输入和生成令牌没有问题。但是,execvp将只接受指针数组,我不知道如何将字符串数组转换为指针数组。以下是我所拥有的:C++ C++;将execvp与字符串数组一起使用,c++,arrays,string,C++,Arrays,String,我正在编写一个程序来执行带有任意数量参数的Unix命令。由于我使用常规字符串,所以接收输入和生成令牌没有问题。但是,execvp将只接受指针数组,我不知道如何将字符串数组转换为指针数组。以下是我所拥有的: #include <cstring> #include <iostream> #include <sstream> #include <string> #include <unistd.h> int main() { while (t
#include <cstring>
#include <iostream>
#include <sstream>
#include <string>
#include <unistd.h>
int main()
{
while (true)
{
int argc = 0;
std::istringstream iss;
std::string command;
std::cout << "$> ";
getline(std::cin, command);
iss.str(command);
for (unsigned i = 0; i <= command.length(); i++)
{
if (command[i] == ' ' || command[i] == '\0')
{
argc++;
}
}
std::string arr[argc+1];
for (int i = 0; i < argc; i++)
{
iss >> arr[i];
}
if (arr[0].compare("quit"))
{
break;
}
else
{
char*argv[argc+1];
for (int i = 0; i < argc; i++)
{
argv[i] = arr[i].c_str(); //This line is wrong
}
argv[argc] = NULL;
execvp(argv[0], argv);
}
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
while(true)
{
int argc=0;
std::istringstream iss;
std::string命令;
标准::cout-arr[i];
}
如果(arr[0]。比较(“退出”))
{
打破
}
其他的
{
字符*argv[argc+1];
对于(int i=0;i
我尝试过各种方法,但不知道如何以正确的方式将字符串转换为字符数组。像strcpy这样的方法不起作用,因为每个参数的长度都会不同。任何帮助都将不胜感激。您的问题是数组中包含
char*
,而std::string::c_str()
返回const char*
。它无法存储在数组中,因为它将丢失常量
如果您使用的是兼容C++11的编译器,则可以使用&arr[i][0]
获取指向内部字符串缓冲区的非常量指针
如果您没有使用符合C++11的编译器,内部缓冲区可能不会以null结尾,因此您唯一的选择是使用new
或malloc
来分配大小正确的缓冲区,然后strcpy
将字符串放入其中
char* buffer = new char[arr[i].length() + 1];
strcpy(buffer, arr[i].c_str());
argv[i] = buffer;
你犯了很小的错误 替换:
argv[i]=arr[i].c_str()代码>带有argv[i]=const_cast(arr[i].c_str())代码>
if(arr[0]。比较(“退出”)
与if(!arr[0]。比较(“退出”)
跑 但我有一些建议,让它使用fork,这样它就不会一次只运行一个命令
示例您可以通过以下方式确保数组中每个字符串末尾的null终止符:
for (int i = 0; i < argc; i++)
{
iss >> arr[i];
arr[i].push_back('\0');
}
让数组常量与c_str()返回常量的事实相匹配怎么样?顺便说一下,您能给我们看一下错误消息吗?我已经尝试将常量添加到数组中,但我得到了“从'const char**'到'char*const*'的无效转换”。但将const放在其他地方只会导致更多错误。没有常量的初始消息说“从常量char*到char*的转换无效”,这是有道理的,但其余的消息却让我感到困惑。好的,你是说稍后在execvp()中?是的!但是,无论是使用
(char*)
还是使用argv[i]=const_cast(arr[i].c_str())来强制转换一个way const代码>将不再保护您免受未经授权的覆盖。谢谢,这非常有效!完全忘记了康斯特演员是一件事。
for (int i = 0; i < argc; i++)
{
argv[i] = &arr[i][0];
}