Взятие целых чисел из строки С++

80
11

Я хотел знать, как я могу захватить числа из строки в C++. Я получаю строку от ввода и получаю несколько строк, но у меня уже есть работа чтения строк. Примечание: строки всегда имеют четное число ints

Здесь я хотел бы, чтобы код выглядел примерно так:

std::getline(std::cin, line);// line looks something like "10 3 40 45 8 12"
int a, b;
while(!line.empty() /*line still has ints to extract*/) {
a = someMethod(line);//gets first int. So, 10 first loop, 40 second, 8 third
b = someMethod(line);//gets second int. So, 3 first loop, 45 second, 12 third
myMethod(a,b);//a method from elsewhere in my code. It here so you know that I need both a and b
}

Ничего подобного не поможет. Большое спасибо!

спросил(а) 2014-06-02T07:04:00+04:00 6 лет, 2 месяца назад
1
Решение
69

Вот полный пример.

#include <sstream>
#include <string>
#include <iostream>

int main(){
std::string line = "2 4 56 6";
std::stringstream stream(line);
int i;
while (stream >> i) {
std::cout << i << std::endl;
}
}

Следующее работает отлично, поэтому чтение нескольких строк не должно быть проблемой.

#include <sstream>
#include <string>
#include <iostream>

int main(){
std::string line = "2 4 56 6";
std::stringstream stream(line);
int i;
while (stream >> i) {
std::cout << i << std::endl;
}

line = "32 62 44 6 22 58 34 60 71 86";
stream.clear();
stream.str(line);
int a,b;
while(stream >> a && stream >> b){
std::cout << a << " " << b << "\n";
}
}

ответил(а) 2014-06-02T07:20:00+04:00 6 лет, 2 месяца назад
39

Существует несколько способов достижения этого. Я предпочитаю использовать boost.

Пример:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>

int main()
{
std::string line = "10 3 40 45 8 12 9"; //std::getline(std::cin, line);// line looks something like "10 3 40 45 8 12"

std::vector<std::string> intNumbers;
std::string s;
boost::split(intNumbers, line, boost::is_any_of(" "), boost::token_compress_on);

unsigned int i=0;
while(i < intNumbers.size())
{
try{
int a = boost::lexical_cast<int>(intNumbers[i++]);

if(i >= intNumbers.size())
{
std::cout << "invlaid values" << std::endl;
break;
}
int b = boost::lexical_cast<int>(intNumbers[i++]);

std::cout << "value a: " << a << std::endl;
std::cout << "value b: " << b << std::endl;

std::cout << "my method (multiply) a*b: " << (a*b) << std::endl;
}
catch(boost::bad_lexical_cast &e)
{
std::cout << "invlaid values" << std::endl;
}
}
}

ответил(а) 2014-06-02T08:10:00+04:00 6 лет, 2 месяца назад
39

Получайте токены из строковой строки и используйте их по своему усмотрению.

#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>

using namespace std;

typedef boost::tokenizer<boost::char_separator<char> >
tokenizer;

void myMethod(int a, int b)
{
cout<<a<<" "<<b<<endl;
}

void getNumber(string line)
{
boost::char_separator<char> sep(" ");
tokenizer tokens(line, sep);
string evenStr, oddStr;

for(tokenizer::iterator iterToken=tokens.begin();
iterToken != tokens.end(); ++iterToken)
{
evenStr = *iterToken;
++iterToken;
if(iterToken != tokens.end())
{
oddStr = *iterToken;
myMethod(atoi(evenStr.c_str()), atoi(oddStr.c_str()));
}
}
}

int main()
{
string line("10 3 40 45 8 12");
getNumber(line);

return 0;
}

ответил(а) 2014-06-02T07:43:00+04:00 6 лет, 2 месяца назад
39

Вы можете сделать так:

string line;
getline(std::cin, line);// line looks something like "10 3 40 45 8 12"
int a, b;

vector<string> tokens;
istringstream iss(line);

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

stringstream s;
for (int i=0;i<tokens.size()/2;i++)
{
s<< tokens[i];
s>>a;
s.clear();
s<<tokens[i+2];
s>>b;
s.clear();
myMethod(a,b);
}

ответил(а) 2014-06-02T07:19:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема