zoukankan      html  css  js  c++  java
  • 利用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); 
  • 相关阅读:
    五种实用DOM方法总结
    九月工作总结
    八月下半月工作总结
    【工作总结】七月底-八月中
    权限管理功能的实现
    JavaWeb项目出现红色感叹号
    项目中遇到的AngularJs问题
    五月工作总结
    生成流水号的优化
    AngularJS scope 作用域的问题
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/13377186.html
Copyright © 2011-2022 走看看