如何将C-String拆分为C-Strings数组

时间:2014-04-17 05:34:50

标签: c++ strtok argv c-strings

在C ++中,我想做

char buffer[1024] = "command insert file1 file2 ..."

并将其转换为

*argv[0] = "command"
*argv[1] = "insert"
*argv[2] = "file1"

等等。难道有一些简单的方法可以做到这一点,比如split()或者其他什么?我不能使用boost或向量,因为元素需要是linux库函数的c字符串(比如execvp),并且它们需要在没有boost或任何额外库的情况下在服务器上编译

我在网上看到过使用strtok的例子,但是这些例子似乎不会在以后存储值,只需打印它们即可。另一种方式似乎是一些非常复杂的方法,涉及循环和计算空格和转义字符。 难道没有更简单的方法吗?这让我疯了。

编辑:作为参考,这是我的主要功能到目前为止的样子:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
#include <iostream>
using namespace std;

void runCommand(char **argv);
void splitIntoArgs(char *command, char **argv);

int main()
{

   char buffer[1024];
   char *argv[5];

   while (1)
   {
       // prompt user for command to run
       cout << "Enter command: ";
       cin >> buffer; //read the buffer
       cout << endl;
       splitIntoArgs(buffer, argv); //split the command into separate arguments
       if (strcmp(argv[0], "exit") == 0)
           return 0;
       runCommand(argv);
   }

}

3 个答案:

答案 0 :(得分:1)

你问这是一个c ++问题,那么为什么你不能以标准库的形式使用c ++的强大功能,它会为你提供std::stringstd::vector

#include <vector>
#include <string>

std::vector<std::string> split(const std::string& str){
    std::vector res;
    size_t old_position = 0;
    for(size_t position = 0; position = str.find(" ", position); position != std::npos){
        res.push_back(res.substr(position, position-old_position));
        old_position = position;
    }
}

答案 1 :(得分:0)

// split string str on " ". The result array has count elements, 
// so make sure count > #of spaces + 1
char** split(char* str, int count){
   char** res = new char*[count];
   int res_i = 0;
   for(int i=0; str[i] != 0 && res_i < count; ++i){
       if(str[i] == ' '){
          res[res_i++] = i + 1;
          str[i] = 0;
       }
   }
   return res;
}

几点说明:

  • 此代码不安全使用。例如,如果“str”的最后一个字符是'',则会得到一个指向空终止符'\ 0'的指针。
  • 在c ++问题中使用char*的标准回复仍然适用于c {+}}
  • split销毁传递给它的原始字符串

答案 2 :(得分:0)

这是分割命令的strtok()版本:

char** split(char *command, int* size) {
  char** ret;
  char* t;
  int i;
  for(i=0, t=strtok(command, " "); t!=NULL;++i ) {
    ret[i]=t;
    t = strtok(NULL, " ");
  }
  *size = i;
  return ret;
}

你可以像这样使用它:

char** args;
int nArgs;
args = split(buffer, &nArgs);
// you can now eg. execvp("/bin/ls", args)