2010-08-06 3 views
4

У меня есть строка с номером на ints, разделенная разделителем пространства. Может ли кто-нибудь помочь мне разбить строку на ints. Я попытался использовать find, а затем substr. Есть ли лучший способ сделать это?splitting int from string

+0

Я не уверен, какой точный формат вы описываете - просто пространственно разделенные номера? Пример строки поможет. –

+0

Поиск в Google "splitting string C++" дает: http://oopweb.com/CPP/Documents/CPPHOWTO/Volume/C++Programming-HOWTO-7.html – Akusete

+0

EX: 12 12 14 14 – brett

ответ

7

Используйте stringsteam:

#include <string> 
#include <sstream> 

int main() { 
    std::string s = "100 123 42"; 
    std::istringstream is(s); 
    int n; 
    while(is >> n) { 
     // do something with n 
    } 
} 
+0

, если есть только два значения как 100 123 каждый раз есть лучший способ сделать это? – brett

+1

@brett Что вы подразумеваете под "better"? – 2010-08-06 07:36:39

+0

Простой и элегантный ... –

2

Это была обсуждена в рамках Split a string in C++?

Кроме того, вы можете использовать библиотеку повысить раздвоение функцию для достижения расщепления без петли в вашей программе. Например.

boost :: split (epoch_vector, epoch_string, boost :: is_any_of (","));

1

A версия используя boost. Версия stringstream от Neil намного проще!

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

int main() 
{ 
    const std::string str("20 30 40 50"); 
    std::vector<int> numbers; 
    boost::tokenizer<> tok(str); 
    std::transform(tok.begin(), tok.end(), std::back_inserter(numbers), 
        &boost::lexical_cast<int,std::string>); 
    // print them 
    std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout,"\n")); 
} 
+1

Вам даже не нужно повышать для этого. Вы можете просто построить экземпляр 'std :: istringstream is (str);' и затем выполнить 'std :: copy (std :: istream_iterator (is), std :: istream_iterator (), std :: back_inserter (числа)); ' –

+0

@reko_t Ницца! Istream_iterator ожидает, что элементы, разделенные пробелами, могут также обрабатывать другие разделители? –

+0

Ожидает, что элементы, разделенные пробелами, не могут обрабатывать другие разделители. –

0

У меня были проблемы при чтении и преобразовании более одной строки (я обнаружил, что мне нужно очистить струнный поток). Вот тест, который я сделал с несколькими преобразованиями int/string с чтением/записью в файл ввода/вывода.

#include <iostream> 
#include <fstream> // for the file i/o 
#include <string> // for the string class work 
#include <sstream> // for the string stream class work 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    // Aux variables: 
    int aData[3]; 
    string sData; 
    stringstream ss; 

    // Creation of the i/o file: 
    // ... 
    // Check for file open correctly: 
    // ... 

    // Write initial data on file: 
    for (unsigned i=0; i<6; ++i) 
    { 
     aData[0] = 1*i; 
     aData[1] = 2*i; 
     aData[2] = 3*i; 

     ss.str(""); // Empty the string stream 
     ss.clear(); 
     ss << aData[0] << ' ' << aData[1] << ' ' << aData[2]; 
     sData = ss.str(); // number-to-string conversion done 

     my_file << sData << endl; 
    } 

    // Simultaneous read and write: 
    for (unsigned i=0; i<6; ++i) 
    { 
     // Read string line from the file: 
     my_file.seekg(0, ios::beg); 
     getline (my_file, sData); // reads from start of file 

     // Convert data: 
     ss.str(""); // Empty the string stream 
     ss.clear(); 
     ss << sData; 
     for (unsigned j = 0; j<3; ++j) 
      if (ss >> aData[j]) // string-to-num conversion done 
       ; 

     // Write data to file: 
     my_file.seekp(0, ios::end); 
     my_file << 100+aData[0] << ' '; // appends at the end of stream. 
     my_file << 100+aData[1] << ' '; 
     my_file << 100+aData[2] << endl; 
    } 
    // R/W complete. 

    // End work on file: 
    my_file.close(); 

    cout << "Bye, world! \n"; 

    return 0; 
}