C++ 获取execvp()Linux c+;的用户输入+;使用std::vecor<;字符*>;

C++ 获取execvp()Linux c+;的用户输入+;使用std::vecor<;字符*>;,c++,linux,vector,C++,Linux,Vector,所以我有一个半工作程序,在那里我使用 getline(std::cin, userinput, '\n') 然后我将输入发送到 std::向量子序列 分解来自用户的输入,以便每个命令元素是独立的 然后把他们都推到一个 std::向量参数 所以我可以将它传递给execvp(…) 这对我来说似乎效率很低,但是有没有更好的方法让用户输入到std::vector,而不需要所有的中间步骤?这个解决方案似乎满足了我的需要。但不确定这是一个多么好的解决方案 std::vector<std::strin

所以我有一个半工作程序,在那里我使用

getline(std::cin, userinput, '\n')
然后我将输入发送到
std::向量子序列
分解来自用户的输入,以便每个命令元素是独立的

然后把他们都推到一个
std::向量参数
所以我可以将它传递给
execvp(…)


这对我来说似乎效率很低,但是有没有更好的方法让用户输入到
std::vector
,而不需要所有的中间步骤?

这个解决方案似乎满足了我的需要。但不确定这是一个多么好的解决方案

std::vector<std::string> processString(std::string userInput)
{
   int j = 0;
   std::vector<std::string> subStrs;
   for (int i = 0; i < userInput.size(); i++)
   {
      bool sameSeq = false;
      if (isalnum(userInput[i]) || ispunct(userInput[i]))
      {
         subStrs.resize(subStrs.size() + 1);
         while (isalnum(userInput[i]) || ispunct(userInput[i]))
         {
            subStrs[j].push_back(userInput[i]);
            sameSeq = true; 
            i++;
         }
         if (sameSeq)
         {
            subStrs[j].push_back('\0');
            j++;   
         }
      }

   }
   return subStrs;
}
std::vector processString(std::string用户输入)
{
int j=0;
std::矢量子序列;
对于(int i=0;i
首先,您的程序应该简单易读,然后只有在性能有问题时,才应该优化iTunes。如果不处理数据,您可能只需要将一个进程的输出直接导入另一个进程。只有在您必须进行一些更改时,读取行才真正相关,否则它只是缓冲数据。例如,我必须允许用户键入ls-l>txt.txt并将ls-l传递给execvp(..),同时打开txt.txt以输出ls-lUnless
execvp
c++
下的操作与
c
下的操作不同,它需要的是一个
NULL
终止的
char**args
[或
char*argl[…]
]。我不确定
vector
是否能直接提供这一点[如果是这样,一切都好]。因此,如果您试图跳过[多个]转换步骤,可能需要使用一些较低级别的函数。请看我最近的回答:因为函数与您需要的非常相似[使用
stdin
而不是文件流并删除外部循环]。