You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按指定规则分割字符串并存储到std::vector<string>中?

解决C++字符串分割问题:提取合法子串到vector

嘿,这个需求其实用C++标准库就能轻松搞定,不用自己造轮子~这里给你两种实用方案,你可以根据习惯选择:

方案一:正则表达式实现(推荐,代码更简洁)

我们可以直接用正则匹配所有符合要求的子串,然后批量存入vector:

#include <iostream>
#include <vector>
#include <string>
#include <regex>
#include <iterator>

int main() {
    std::string inputLine;
    std::getline(std::cin, inputLine);
    std::vector<std::string> inputs;

    // 定义正则规则:匹配一个或多个字母(大小写)或连字符
    std::regex re(R"([a-zA-Z-]+)");
    // 用迭代器遍历所有匹配结果
    std::sregex_iterator matchIt(inputLine.begin(), inputLine.end(), re);
    std::sregex_iterator endIt;

    // 将所有匹配到的子串存入vector
    for (; matchIt != endIt; ++matchIt) {
        inputs.push_back(matchIt->str());
    }

    // 测试输出(可按需删除)
    for (const auto& str : inputs) {
        std::cout << str << std::endl;
    }
    return 0;
}

关键细节说明:

  • 用原始字符串字面量R"(...)"定义正则,避免转义字符的麻烦;[a-zA-Z-]+表示匹配一个及以上的字母(大小写)或连字符,完全贴合你的规则。
  • std::sregex_iterator是专门用来遍历字符串中所有正则匹配结果的工具,能自动跳过所有分隔符,直接定位合法子串。

方案二:手动遍历字符串(适合不想依赖正则的场景)

如果不想用正则库,也可以手动逐个字符判断,构建合法子串:

#include <iostream>
#include <vector>
#include <string>
#include <cctype>

int main() {
    std::string inputLine;
    std::getline(std::cin, inputLine);
    std::vector<std::string> inputs;
    std::string currentSubStr;

    for (char c : inputLine) {
        // 判断当前字符是否为字母或连字符
        if (std::isalpha(static_cast<unsigned char>(c)) || c == '-') {
            currentSubStr += c;
        } else {
            // 遇到分隔符时,若当前子串非空则存入vector并清空
            if (!currentSubStr.empty()) {
                inputs.push_back(currentSubStr);
                currentSubStr.clear();
            }
        }
    }

    // 处理字符串末尾的合法子串(避免最后一段没被存入)
    if (!currentSubStr.empty()) {
        inputs.push_back(currentSubStr);
    }

    // 测试输出(可按需删除)
    for (const auto& str : inputs) {
        std::cout << str << std::endl;
    }
    return 0;
}

关键细节说明:

  • 用std::isalpha判断字母时,转成unsigned char是为了避免字符编码异常导致的错误。
  • 遍历结束后要额外检查currentSubStr,防止字符串最后一段合法字符没被存入vector。

测试你给出的示例输入"hello,sir my nameéis ada-m",两种方案都会得到hello、sir、my、name、is、ada-m这些元素,完全符合需求~

内容的提问来源于stack exchange,提问作者KingAzaiez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:02:53