C++ 拆分字符串函数给出意外输出

C++ split string function gives unexpected output

std::vector<char*> Split(std::string input) {
  std::vector<char*> ret;
  std::istringstream f(input);
  std::string s;
  while (getline(f, s, ' ')) {
    ret.push_back((char*)s.c_str());
  }
  return ret;
}

这个函数的目的是获取一个字符串并将每个单词放入一个向量中。但是假设我把 ls -l 作为字符串。它应该 return 一个包含两个元素 ls-l 的向量。相反,它 return 是一个包含两个元素 -ll 的向量。谁能帮我解决这个问题?

您正在向量中存储指向字符串的指针,但字符串 s 在函数退出时被销毁。所以你正在存储指向已删除对象的指针。

使用字符串而不是指针。与指针不同,字符串很容易正确复制。试试这个

std::vector<std::string> Split(std::string input) {
  std::vector<std::string> ret;
  std::istringstream f(input);
  std::string s;
  while (getline(f, s, ' ')) {
    ret.push_back(s);
  }
  return ret;
}

复制指针并不意味着复制指向的内容。

看来你必须复制字符串。

#include <cstring> // for strlen() and strcpy()

std::vector<char*> Split(std::string input) {
  std::vector<char*> ret;
  std::istringstream f(input);
  std::string s;
  while (getline(f, s, ' ')) {
    char* buf = new char[strlen(s.c_str()) + 1]; // +1 for terminating null-character
    strcpy(buf, s.c_str());
    ret.push_back(buf);
  }
  return ret;
}

您从其他两个答案中得到了答案,但我有另一种拆分字符串的方法(称为 String Tokenization):

std::vector<std::string> split(std::string text) {
    std::vector<std::string> words;

    std::string temp{};
    for (int i=0; i < text.size(); ++i) {
        if (text[i] != ' ') {
            temp.push_back(text[i]);
            if (i ==  text.size()-1) {
                words.push_back(temp);
            }
        }
        else if (temp.size() != 0) {
            words.push_back(temp);
            temp.clear();
        }
    }

    return words;
}