将字符串解析为整数数组

时间:2010-11-23 17:22:25

标签: c++ arrays algorithm parsing

我正在寻找一种方法将具有指定分隔符(例如斜杠或空格)的字符串转换为这些分隔符分隔的整数数组。

例如,如果用户输入12/3/875/256,我需要检索数组{12, 3, 875, 256}。理想情况下,它可以处理任意长度。

我尝试逐字逐句地扫描字符串,并将不是分隔符的所有内容存储在临时变量中,下次遇到分隔符时将其添加到数组中。不幸的是,类型转换是一个痛苦的屁股。有更简单的方法吗?

5 个答案:

答案 0 :(得分:2)

您可以将'/'设置为分隔符并使用getline进行读取吗?然后你必须把每个变成一个变量,你需要知道大小 - 也许你可以通过数组并计算斜杠?那么你就知道了,并且可以先设置数组。您可能需要将每个字符串段解析为int,这可能是也可能不困难。 (暂时没有使用过c ++,我记不太方便了。)

请参阅here,了解如何完成此操作(3个帖子)。

答案 1 :(得分:1)

strtok和strtol? (这有点舌头.Strtok通常不是一个好主意)

Parsing String to Array of Integers

涵盖拆分

在C ++中将字符串转换为int有很多相关的问题https://stackoverflow.com/search?q=convert+string+to+int+c%2B%2B

类型转换有什么问题?就我所见,它似乎并不是一个障碍。

你能展示你的代码吗?

答案 2 :(得分:1)

答案 3 :(得分:1)

看看this other answer。它甚至有一个使用boost :: tokenizer的tokenizer代码的例子。

编辑:

我在那里复制了代码并进行了必要的修改:

#include <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/tokenizer.hpp>
#include <vector>
#include <boost/lexical_cast.hpp>
#include <iterator>
#include <algorithm>

using namespace std;
using namespace boost;

int main(int argc, char** argv)
{
   string text = "125/55/66";
   vector<int> vi;

   char_separator<char> sep("/");
   tokenizer<char_separator<char> > tokens(text, sep);
   BOOST_FOREACH(string t, tokens)
   {
      vi.push_back(lexical_cast<int>(t));
   }

   copy(vi.begin(), vi.end(), ostream_iterator<int>(cout, "\n"));
}

将打印:

125
55
66

答案 4 :(得分:0)

你可以使用Boost.splitBoost.lexical_cast的组合来分解你想要的任何分隔符的字符串,然后你可以将它全部用词汇表示。

#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp>


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

int main()
{
    std::string s = "11/23/2010";
    std::vector<std::string> svec;
    std::vector<int> ivec;

    // split the string 's' on '/' delimiter, and the resulting tokens
    // will be in svec.
    boost::split(svec, s, boost::is_any_of("/"));

    // Simple conversion - iterate through the token vector svec
    // and attempt a lexical cast on each string to int
    BOOST_FOREACH(std::string item, svec)
    {
        try
        {
            int i = boost::lexical_cast<int>(item);
            ivec.push_back(i);
        }
        catch (boost::bad_lexical_cast &ex)
        {
            std::cout << ex.what();
        }
    }

    return 0;
}

未经测试......此机器没有增强功能。

您可以使用其他方式将std::string / char *转换为int类型,直接使用stringstream,或使用atoi等C构造。