首页 > 解决方案 > 将(例如)12345:12-34 转换为三个整数: (12345, 12, 34) C++ 字符串?

问题描述

将这些分成 3 个整数的最快方法是什么?我觉得这应该是可能的,但我能找到的最接近的是:

#include <ostream> 
#include <iostream> 
#include <string> 
#include <sstream> 
#include <vector> 
 
std::vector<int> extract_ints(std::string const& input_str) 
{ 
    std::vector<int> ints; 
    std::istringstream input(input_str); 
 
    std::string number; 
    while (std::getline(input, number, ':')) 
    { 
        std::istringstream iss(number); 
        int i; 
        iss >> i; 
        ints.push_back(i); 
    } 
 
    return ints; 
} 
int main() 
{ 
    typedef std::vector<int> ints_t; 
 
    ints_t const& ints = extract_ints("3254:23-45"); 
    for (ints_t::const_iterator i = ints.begin(), i_end = ints.end(); i != i_end; ++i) 
        std::cout << *i << std::endl; 
 
    return 0; 
} 

在这里找到:https ://social.msdn.microsoft.com/Forums/vstudio/en-US/411271cd-5e8a-46f9-a78b-a49a347741c0/comma-delimited-string-to-integer-array?forum=vcgeneral

并且实际操作的链接在这里:https://godbolt.org/z/8sP9vvqfv但首先它只会在':'之间分开,不知道如何扩展到':'和'-的也。但其次,这似乎过于复杂......这真的是最好的方法吗?

谢谢

标签: c++stringtype-conversionintegerdata-conversion

解决方案


如何扩展为':'

您从输入中读取一个字符并检查它是否为:. 例如:

#include <iostream>
#include <exception>
#include <vector>
#include <sstream>
#include <exception>
std::vector<int> extract_ints(std::string const& input_str) 
{ 
    std::vector<int> r(3); 
    std::istringstream iss(input_str); 
    char c1;
    char c2;
    if (!(
         iss >> r.at(0) >> c1 >> r.at(1) >> c2 >> r.at(2) &&
         c1 == ':' && c2 == '-' &&
         !(iss >> c1)  // test if we are at EOF
    )) {
        throw std::runtime_error("Och och, invalid string");
    }
    return r;
}
int main() {
    for (auto&& i : extract_ints("3254:23-45")) {
        std::cout << i << '\n';
    }
}

推荐阅读