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

如何将含字符与整数的随机字符串解析为分离的vector?

当然可以用stringstream实现这个需求!这其实是处理这类字符串拆分任务非常顺手的方案,完全符合你预想的思路~下面给你两种具体的实现方式,都能精准把输入字符串拆分到目标的两个vector中:

方法一:利用异常处理判断类型

这种方式通过尝试将每个拆分出的 token 转换为整数,借助异常来判断它是字符串还是数字:

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

int main() {
    std::string inputStr = "abc 12 aa 4 34 2 3 40 3 4 2 cda t 4 car 3";
    std::stringstream ss(inputStr);
    std::vector<std::string> strVec;
    std::vector<int> intVec;
    
    std::string token;
    // 按空格拆分输入字符串,逐个处理每个token
    while (ss >> token) {
        try {
            // 尝试把token转换成整数
            int num = std::stoi(token);
            intVec.push_back(num);
        } catch (const std::invalid_argument&) {
            // 转换失败,说明是普通字符串
            strVec.push_back(token);
        } catch (const std::out_of_range&) {
            // 数字超出int范围的情况,可根据需求调整处理逻辑,这里默认放进字符串vector
            strVec.push_back(token);
        }
    }
    
    // 验证结果
    std::cout << "strVec: ";
    for (const auto& s : strVec) {
        std::cout << "\"" << s << "\" ";
    }
    std::cout << "\nintVec: ";
    for (int num : intVec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

逻辑说明:

  1. 用stringstream将输入字符串按空格自动拆分为一个个token,这正好匹配你的输入格式。
  2. 对每个token,用std::stoi尝试转换为整数:
    • 转换成功就加入intVec;
    • 如果抛出invalid_argument异常,说明这个token不是合法数字,就加入strVec;
    • 额外处理out_of_range异常,避免超大数字导致程序崩溃。

方法二:通过流读取状态判断类型

如果你不想用异常处理,也可以借助子流的读取状态来判断类型,代码更偏向“纯流操作”风格:

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

int main() {
    std::string inputStr = "abc 12 aa 4 34 2 3 40 3 4 2 cda t 4 car 3";
    std::stringstream ss(inputStr);
    std::vector<std::string> strVec;
    std::vector<int> intVec;
    
    std::string token;
    while (ss >> token) {
        int num;
        std::istringstream tokenStream(token);
        // 尝试从token的子流中读取整数
        if (tokenStream >> num) {
            // 读取成功,说明是整数
            intVec.push_back(num);
        } else {
            // 读取失败,说明是普通字符串
            strVec.push_back(token);
        }
    }
    
    // 验证结果
    std::cout << "strVec: ";
    for (const auto& s : strVec) {
        std::cout << "\"" << s << "\" ";
    }
    std::cout << "\nintVec: ";
    for (int num : intVec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

逻辑说明:

  1. 同样先拆分出每个token;
  2. 为每个token创建一个单独的istringstream,尝试从中读取整数;
  3. 如果读取操作返回true,说明token是合法整数,加入intVec;否则加入strVec。

两种方法都能完美实现你的需求,你可以根据自己的编程习惯选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:36:13