Разбор строки в массиве целых чисел - PullRequest
2 голосов
/ 23 ноября 2010

Я ищу способ преобразования строки с указанными разделителями (например, косыми чертами или пробелами) в массив целых чисел, разделенных этими разделителями.

Например, если пользователь вводит 12/3/875/256, мне нужно получить массив {12, 3, 875, 256}. В идеале он мог бы обрабатывать произвольную длину.

Я попытался прокрутить строку за символом и сохранить все, что не является делителем, во временной переменной, которая добавляется в массив при следующей встрече с символом делителя. К сожалению, преобразования типов являются болью в заднице. Есть ли более простой способ сделать это?

Ответы [ 5 ]

2 голосов
/ 23 ноября 2010

Вы можете установить '/' в качестве разделителя и читать, используя getline? тогда вам придется поместить каждый из них в переменную, и вам нужно будет знать размер - может быть, вы можете передать массив и сосчитать косую черту? тогда вы узнаете об этом и сможете сначала настроить массив. Вам может понадобиться проанализировать каждый строковый сегмент в int, что может быть или не быть сложным. (давно не пользовался c ++, не помню удобного способа.)

См. здесь для небольшого примера того, как это делается (3 сообщения вниз).

1 голос
/ 23 ноября 2010

Взгляните на этот другой ответ . В нем даже есть пример кода токенизатора, использующего boost :: tokenizer.

EDIT:

Я скопировал туда код с необходимыми изменениями:

#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
1 голос
/ 23 ноября 2010

Попробуйте использовать boost :: tokenizer и boost :: lexical_cast

1 голос
/ 23 ноября 2010

стрток и стртол?(это не совсем понятно. Strtok, как правило, не очень хорошая идея)

Разделение рассматривается в этом разборе строки на массив целых чисел

преобразование строк в intв C ++ есть довольно много актуальных вопросов https://stackoverflow.com/search?q=convert+string+to+int+c%2B%2B

В чем проблема с преобразованиями типов?Насколько я понимаю, это не блок.

Можете ли вы показать свой код?

0 голосов
/ 23 ноября 2010

Вы можете использовать комбинацию Boost.split и Boost.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 использованиенепосредственно, или C конструирует как atoi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...