2013-06-26 3 views
4

Мне нужна помощь в получении всех целых чисел из std :: string и получении каждого из этих целых чисел в переменной int.Читать все целые числа из строки C++

Строка Пример:

<blah> hi 153 67 216 

Я хотел бы программу игнорировать «бла» и «привет» и хранить каждое из чисел в переменную Int. Так что выходит, чтобы быть как:

a = 153 
b = 67 
c = 216 

Тогда я могу свободно печатать каждый в отдельности, как:

printf("First int: %d", a); 
printf("Second int: %d", b); 
printf("Third int: %d", c); 

Спасибо!

+0

Поиск по сайту. Об этом спрашивали и отвечали тысячи раз. –

+0

Что такое '' должно быть? – 0x499602D2

+0

@ 0x499602D2 это может быть что угодно "sdnjid blah hi 23 35 2" это был всего лишь пример – Mike

ответ

8

Вы можете создать свою собственную функцию, которая манипулирует a std::ctype фасет с использованием метода scan_is.После этого вы можете вернуть сгенерированную строку в stringstream объекта и вставить его содержимое в ваших целых чисел:

#include <iostream> 
#include <locale> 
#include <string> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 
#include <cstring> 

std::string extract_ints(std::ctype_base::mask category, std::string str, std::ctype<char> const& facet) 
{ 
    using std::strlen; 

    char const *begin = &str.front(), 
       *end = &str.back(); 

    auto res = facet.scan_is(category, begin, end); 

    begin = &res[0]; 
    end = &res[strlen(res)]; 

    return std::string(begin, end); 
} 

std::string extract_ints(std::string str) 
{ 
    return extract_ints(std::ctype_base::digit, str, 
     std::use_facet<std::ctype<char>>(std::locale(""))); 
} 

int main() 
{ 
    int a, b, c; 

    std::string str = "abc 1 2 3"; 
    std::stringstream ss(extract_ints(str)); 

    ss >> a >> b >> c; 

    std::cout << a << '\n' << b << '\n' << c; 
} 

Выход:

Demo

+0

+1 Отличное решение. –

+0

... но не хватает '#include ' for 'std :: back_inserter' –

+0

@CaptainObvlious Вы правы, спасибо. ;) – 0x499602D2

1
  • Используйте std::isdigit(), чтобы проверить, является ли символ цифрой. Пока пространство не будет достигнуто, добавьте поэтапно к отдельному string.
  • Затем используйте std::stoi(), чтобы преобразовать строку в int.
  • Очистить содержимое строки, используя метод clear().
  • Перейти к первому шагу

Повторяйте до конца базовой строки не достигается.

1

Первое использование string tokenizer

std::string text = "token, test 153 67 216"; 

char_separator<char> sep(", "); 
tokenizer< char_separator<char> > tokens(text, sep); 

Тогда, если вы не знаете точно, сколько значений вы получите, вы не должны использовать отдельные переменные a b c, но массив как int input[200], или лучше, std::vector, который может адаптироваться к количеству прочитанных элементов.

std::vector<int> values; 
BOOST_FOREACH (const string& t, tokens) { 
    int value; 
    if (stringstream(t) >> value) //return false if conversion does not succeed 
     values.push_back(value); 
} 

for (int i = 0; i < values.size(); i++) 
    std::cout << values[i] << " "; 
std::cout << std::endl; 

Вы должны:

#include <string> 
#include <vector> 
#include <sstream> 
#include <iostream> //std::cout 
#include <boost/foreach.hpp> 
#include <boost/tokenizer.hpp> 
using boost::tokenizer; 
using boost::separator; 

Кстати, если вы программирования C++ вы можете избежать использования printf, и предпочитают std::cout

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

int main() { 
    using namespace std; 
    int n=8,num[8]; 
    string sentence = "10 20 30 40 5 6 7 8"; 
    istringstream iss(sentence); 

    vector<string> tokens; 
copy(istream_iterator<string>(iss), 
    istream_iterator<string>(), 
    back_inserter(tokens)); 

    for(int i=0;i<n;i++){ 
    num[i]= atoi(tokens.at(i).c_str()); 
    } 

    for(int i=0;i<n;i++){ 
    cout<<num[i]; 
    } 

} 
0

Чтобы прочитать строку строки и извлечь из него целое,

getline(cin,str); 
stringstream stream(str); 
while(1) 
    { 
    stream>>int_var_arr[i]; 
    if(!stream) 
      break; 
    i++; 
    } 
    } 

целые числа хранятся в int_var_arr []