C ++分割字符串函数提供了意外的输出

时间:2020-08-02 11:21:47

标签: c++ string stdvector

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作为字符串。它应返回一个包含两个元素ls-l的向量。而是返回带有两个元素-ll的向量。有人可以帮我吗?

3 个答案:

答案 0 :(得分:0)

您将在向量中存储指向字符串的指针,但是在函数退出时字符串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;
}

答案 1 :(得分:0)

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

似乎您必须复制字符串。

class AddressBody extends Component {

render() {
    let { addresses, showCart, deliveryTimeSetted, deleteAddress, deleteAddressResponse } = this.props;


if (showCart && Object.keys(showCart).length && "data" in showCart && showCart.data.items.length) {
      showCart.data.items.map((value, index) => {
        images.push(
          <div className="product-item">
            <img src={value.product.default_photo.photo_file.xsmall} />
          </div>
        );
      });
      leftMenuComponent = <LeftMenu showCart={showCart.data} />;
    }

if (deleteAddressResponse && !deleteAddressResponse.success) {
      alert(deleteAddressResponse.message);
      this.props.fetchData("", types.DELETE_ADDRESS_RESPONSE, false);
    }
if(addresses)...
if(deliveryTimeSetted) .....

return (......
....

答案 2 :(得分:0)

您从其他两个答案中得到了答案,但是我有另一种方法来分割字符串(称为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;
}