如何将含字符与整数的随机字符串解析为分离的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; }
逻辑说明:
- 用
stringstream将输入字符串按空格自动拆分为一个个token,这正好匹配你的输入格式。 - 对每个
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; }
逻辑说明:
- 同样先拆分出每个
token; - 为每个
token创建一个单独的istringstream,尝试从中读取整数; - 如果读取操作返回
true,说明token是合法整数,加入intVec;否则加入strVec。
两种方法都能完美实现你的需求,你可以根据自己的编程习惯选择~
内容的提问来源于stack exchange,提问作者Athena
相关产品推荐
相关产品推荐

