在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);
}
}
答案 0 :(得分:1)
你问这是一个c ++问题,那么为什么你不能以标准库的形式使用c ++的强大功能,它会为你提供std::string
和std::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;
}
几点说明:
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)