C++ C++;将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

我正在编写一个程序来执行带有任意数量参数的Unix命令。由于我使用常规字符串,所以接收输入和生成令牌没有问题。但是,execvp将只接受指针数组,我不知道如何将字符串数组转换为指针数组。以下是我所拥有的:

#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];
    }