2014-12-09 5 views
-2

Моя проблема звучит так: у меня в качестве входных данных огромная строка с номерами, разделенными пробелами. Мне нужно разбить эту строку и поместить компоненты в вектор, а затем использовать ее компоненты. (затем преобразовать в целые числа bla bla ...).Сплит-строка, компоненты которой должны быть записаны в векторе

Я искал здесь для этого, но я не совсем понял некоторые вещи, поэтому, пожалуйста, немного объясните.

Также возникает вопрос: почему следующее возвращает еще одну «Подстроку:» в конце?

int main() 
{ 
    string s("10 20 30 50 2000"); 
    istringstream iss(s); 

    while (iss) 
    { 
     string sub; 
     iss >> sub; 
     cout << "Substring: " << sub << endl; 
    } 
    system("pause"); 
    return 0; 
} 
+1

[ 'станд :: вектор :: push_back()'] (http://en.cppreference.com/w/cpp/container/vector/push_back) – 0x499602D2

+0

Что такое ваш вопрос? Помимо «помогите пожалуйста» –

ответ

2

почему после возвращения еще один "подстроки:" в конце концов?

Потому что ваша петля сломана; вы проверяете состояние потока до, читая его. Это та же проблема, как описано в разделе:

0

Первый подсчитывают количество непечатаемых вроде этого:

int i = counter; 

for(size_t i = 0; i < s.size(); ++i) 
{ 
    if(' ' == s[i]) 
    { 
     ++counter; 
    } 
} 

После этого вы должны подстроки в другой цикл струна ов ,

0

Попробуйте следующий подход

#include <iostream> 
#include <string> 
#include <sstream> 
#include <vector> 
#include <iterator> 

int main() 
{ 
    std::string s("10 20 30 50 2000"); 

    std::istringstream is(s); 

    std::vector<std::string> v((std::istream_iterator<std::string>(is)), 
           std::istream_iterator<std::string>()); 

    for (const std::string &t : v) std::cout << t << std::endl;         

    return 0; 
} 

Выход

10 
20 
30 
50 
2000 

Вы могли бы сначала определить вектор как имеющий тип std::vector<int> и в вектор инициализации использования итератора std::istream_iterator<int>.

Что касается вашего второго вопроса, то перед выводом строки вам нужно проверить, было ли оно прочитано. Таким образом, правильный цикл будет выглядеть

string sub; 

while (iss >> sub) 
{ 
    cout << "Substring: " << sub << endl; 
} 
Смежные вопросы