利用c++ std::getline实现split

getline reads characters from an input stream and places them into a string:

 getline从输入流中读取字符, 并把它们转换成字符串.

getline(input, str, delim), 默认的分隔符是’ ’字符.

参数

input - 流中获取数据
str - 把数据转换成字符串
delim - 分隔符

例一:

#include <string>
#include <iostream>
#include <sstream>

int main()
{
    // greet the user
    std::string name;
    std::cout << "What is your name? ";
    std::getline(std::cin, name);
    std::cout << "Hello " << name << ", nice to meet you.
";

    // read file line by line
    std::istringstream input;
    input.str("1
2
3
4
5
6
7
");
    int sum = 0;
    for (std::string line; std::getline(input, line); ) {
        sum += std::stoi(line);
    }
    std::cout << "
The sum is: " << sum << "
";
}

注意:

c++中的atoi()和stoi()函数的用法和区别:

相同点:
①都是C++的字符处理函数,把数字字符串转换成int输出
不同点:
①atoi()的参数是 const char* ,因此对于一个字符串str我们必须调用 c_str()的方法把这个string转换成 const char*类型的,而stoi()的参数是const string*,不需要转化为 const char*;

②stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error!

而atoi()不会做范围检查,如果超出范围的话,超出上界,则输出上界,超出下界,则输出下界;

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

void split(const std::string& s,
    std::vector<std::string>& sv,
                   const char delim = ' ') {
    sv.clear();
    std::istringstream iss(s);
    std::string temp;

    while (std::getline(iss, temp, delim)) {
        sv.emplace_back(std::move(temp));
    }

    return;
}

int main() {
    std::string s("abc:def:ghi");
    std::vector<std::string> sv;

    split(s, sv, ':');

    for (const auto& s : sv) {
        std::cout << s << std::endl;
    }

    return 0;
}

 或者:默认是空格和tab为分割符

istringstream strcin(str);
string s;
vector<string> vs;
while(strcin >> s) vs.push_back(s);
 

istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。

  istringstream的构造函数原形如下:

  istringstream::istringstream(string str); 
原文地址:https://www.cnblogs.com/wsw-seu/p/13377186.html