2010-11-23 5 views
2

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

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

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

ответ

2

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

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

1

strtok и strtol? (Это несколько ироничный. Strtok обычно не очень хорошая идея)

Расщепление покрыта в этом Parsing String to Array of Integers

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

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

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

+0

Почему нет strtok хорошая идея? – Maxpm 2010-11-23 17:31:49

1

Посмотрите на this other answer. Он даже имеет пример кода токенизатора с использованием 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 
0

Вы можете использовать комбинацию Boost.split и Boost.lexical_cast, чтобы разбить string любыми разделителями, которые вы хотите, а затем вы можете использовать лексику.

#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.

Смежные вопросы