两种在C++中分割字符串的常用方法

在C++中,分割字符串是一个常见的操作,尤其是在处理文件路径、命令行参数、日志消息等场景时。虽然C++标准库(直到C++20之前)没有直接提供分割字符串的函数,但我们可以通过多种方式来实现这一功能。下面我将介绍两种常用的方法来分割字符串:

图片[1]_两种在C++中分割字符串的常用方法_知途无界

1. 使用std::stringstd::istringstream

这种方法利用了std::istringstream,它允许我们从字符串中读取数据,就像从一个流中读取一样。我们可以使用空格、逗号或其他分隔符作为分隔来分割字符串。

#include <iostream>  
#include <sstream>  
#include <vector>  
#include <string>  
  
std::vector<std::string> splitString(const std::string &s, char delimiter) {  
    std::vector<std::string> tokens;  
    std::string token;  
    std::istringstream tokenStream(s);  
    while (std::getline(tokenStream, token, delimiter)) {  
        tokens.push_back(token);  
    }  
    return tokens;  
}  
  
int main() {  
    std::string str = "apple,banana,cherry";  
    char delim = ',';  
    auto tokens = splitString(str, delim);  
  
    for (const auto& token : tokens) {  
        std::cout << token << std::endl;  
    }  
  
    return 0;  
}

注意:这里使用了std::getline而不是直接读取整个流,这是为了按指定的分隔符分割字符串。

2. 使用std::string和循环

这种方法更加基础,直接遍历字符串,根据分隔符来分割字符串。这种方法的好处是你可以更细致地控制分割过程,比如忽略空字符串、去除分隔符周围的空白等。

#include <iostream>  
#include <vector>  
#include <string>  
  
std::vector<std::string> splitString(const std::string &s, char delimiter) {  
    std::vector<std::string> tokens;  
    std::string token;  
    for (char c : s) {  
        if (c == delimiter) {  
            if (!token.empty()) {  
                tokens.push_back(token);  
                token.clear();  
            }  
        } else {  
            token += c;  
        }  
    }  
    // 添加最后一个token(如果有的话)  
    if (!token.empty()) {  
        tokens.push_back(token);  
    }  
    return tokens;  
}  
  
int main() {  
    std::string str = "apple,banana,cherry";  
    char delim = ',';  
    auto tokens = splitString(str, delim);  
  
    for (const auto& token : tokens) {  
        std::cout << token << std::endl;  
    }  
  
    return 0;  
}

这两种方法各有优缺点,选择哪一种取决于你的具体需求,比如对性能的要求、是否需要处理复杂的分割逻辑等。在C++20中,字符串处理得到了更多的支持,包括std::string_view和可能的字符串分割函数(尽管C++20标准库直接未提供分割函数,但可以使用其他库或继续采用上述方法)。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞90 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容