c ++按字符分割字符串?

use*_*775 13 c++ arrays string split

如何102:330:3133:76531:451:000:12:44412通过" :"字符拆分诸如" " 的字符串,并将所有数字放入一个int数组(数字序列始终为8长)最好不使用外部库,如boost.

另外,我想知道如何在处理之前从字符串中删除不需要的字符,例如"$"和"#"?

her*_*tao 9

stringstream 可以做所有这些.

  1. 拆分字符串并存储到int数组中:

    string str = "102:330:3133:76531:451:000:12:44412";
    std::replace(str.begin(), str.end(), ':', ' ');  // replace ':' by ' '
    
    vector<int> array;
    stringstream ss(str);
    int temp;
    while (ss >> temp)
        array.push_back(temp); // done! now array={102,330,3133,76531,451,000,12,44412}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在处理之前从字符串中删除不需要的字符,例如$#:就像:上面的处理方式一样.

  • 这是一个非常具体的答案,如果字符串包含空格则不起作用. (3认同)

phu*_*clv 8

C中的标准方式是strtok像其他人一样使用已经回答.但是strtokC++样,也不安全.C++中的标准方法是使用std::istringstream

std::istringstream iss(str);
char c; // dummy character for the colon
int a[8];
iss >> a[0];
for (int i = 1; i < 8; i++)
    iss >> c >> a[i];
Run Code Online (Sandbox Code Playgroud)

如果输入总是具有固定数量的令牌,则sscanf可能是另一种简单的解决方案

std::sscanf(str, "%d:%d:%d:%d:%d:%d:%d:%d", &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8);
Run Code Online (Sandbox Code Playgroud)


Lan*_*der 7

我之前不得不编写类似这样的代码,并在Stack Overflow上发现了一个问题,该问题用于使用定界符分割字符串。这是原始问题:link

您可以将其std::stoi用于构建向量。

std::vector<int> split(const std::string &s, char delim) {
    std::vector<int> elems;
    std::stringstream ss(s);
    std::string number;
    while(std::getline(ss, number, delim)) {
        elems.push_back(std::stoi(number));
    }
    return elems;
}

// use with:
const std::string numbers("102:330:3133:76531:451:000:12:44412");
std::vector<int> numbers = split(numbers, ':');
Run Code Online (Sandbox Code Playgroud)

这是一个有效的二碘酮样品