1

可能重复:
在 C++ 中拆分字符串

我有一个字符串:
14332x+32x=10
我想将其拆分,使其看起来像:
[14332][+32][10]
到目前为止,我已经尝试过

char c;
std::stringstream ss(equation1);
while (ss >> c) {
    std::cout << c << std::endl;
} 

但是在测试了打印的内容之后,我认为不可能从该信息中进行操作。我知道我需要在 x 和 = 上拆分字符串,但我不确定这是否可行以及是否可行。我用谷歌搜索了它,没有发现任何看起来有帮助的东西,但我也是 C++ 新手,答案可能就在我面前。
我不想使用boost。任何意见将是有益的!

4

5 回答 5

4

考虑使用指定x=作为空白字符的构面:

#include <locale>
#include <iostream>
#include <sstream>

struct punct_ctype : std::ctype<char> {
  punct_ctype() : std::ctype<char>(get_table()) {}
  static mask const* get_table()
  {
    static mask rc[table_size];
    rc[' '] = std::ctype_base::space;
    rc['\n'] = std::ctype_base::space;
    rc['x'] = std::ctype_base::space;
    rc['='] = std::ctype_base::space;
    return &rc[0];
  }
};

int main() {
  std::string equation;
  while(std::getline(std::cin, equation)) {
    std::istringstream ss(equation);
    ss.imbue(std::locale(ss.getloc(), new punct_ctype));
    std::string term;
    while(ss >> term) {
      std::cout << "[" << term << "]";
    }
    std::cout << "\n";
  }
}
于 2013-01-31T02:21:43.527 回答
1

你可以sscanf这样使用:

sscanf(s.c_str(), "%[^x]x%[^x]x=%s", a, b, c);

where%[^x]表示“除 x 之外的任何字符”。如果您不关心符号(即+等)而只关心数字,则可以执行以下操作:

sscanf(s.c_str(), "%dx%dx=%d", &x, &y, &z);
于 2013-01-31T01:41:27.113 回答
1

手动方法是对字符串中的每个字符执行 for 循环,如果该字符是 == 您拆分的字符,则将其复制到一个新字符串(如果预期 >1 拆分,则使用字符串列表/数组)。

此外,我认为 std 已按字符功能划分。如果不是,那么 stringstream::GetLine() 有一个重载,它接受一个字符来分割,它会忽略空格。

GetLine() 非常好:)

于 2013-01-31T01:15:20.807 回答
0

有关提供简单、基本标记化功能的功能,请参阅此 SO 答案,该getline_until()功能应该让您执行以下操作:

#include <string>
#include <stringstream>

#include "getline_until.h"

int main()
{
    std::string equation1("14332x+32x=10");
    std::stringstream ss(equation1);

    std::string token;
    while (getline_until(ss, token, "x=")) {
        if (!token.empty()) std::cout << "[" << token << "]";
    } 

    std::cout << std::endl;
}

getline_until()函数允许您指定类似于的分隔符列表strtok()(尽管getline_until()将返回空标记而不是跳过一系列分隔符,例如strtok())。或者,您可以提供一个谓词,让您使用函数来决定何时分隔标记。

它不会让你做的一件事(再次 - 类似于strtok()或标准getline())是仅在上下文中拆分标记 - 必须有一个分隔符被丢弃。例如,使用以下输入:

42+24

getline_until()(like strtok()or getline()) 不能将上述内容拆分为标记42,+24.

于 2013-01-31T07:34:50.463 回答
0

如果你不介意使用 c++11,你可以使用类似这样的东西:

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
#include <unordered_set>

typedef std::vector<std::string> strings;
typedef std::unordered_set<char> tokens;

struct tokenize
{
    tokenize(strings& output,const tokens& t) : 
    v_(output),
    t_(t)
    {}        
    ~tokenize()
    {
        if(!s.empty())
            v_.push_back(s);
    }
    void operator()(const char &c)
    {
        if(t_.find(c)!=t_.end())
        {
            if(!s.empty())
                v_.push_back(s);
            s="";
        }
        else
        {
            s = s + c;
        }
    }
    private:
    std::string s;
    strings& v_;
    const tokens& t_;
};

void split(const std::string& input, strings& output, const tokens& t )
{
    tokenize tokenizer(output,t);
    for( auto i : input )
    {
        tokenizer(i);
    }
}

int main()
{
    strings tokenized;
    tokens t;
    t.insert('x');
    t.insert('=');
    std::string input = "14332x+32x=10";
    split(input,tokenized,t);
    for( auto i : tokenized )
    {
        std::cout<<"["<<i<<"]";
    }
    return 0;
}

上面代码的ideone链接:http: //ideone.com/17g75F

于 2013-01-31T02:29:41.777 回答