извлечь числа из строки с ++ - PullRequest
1 голос
/ 01 марта 2012

У меня есть строка, которая выглядит так:

foo
$RESULT :(0.2374742, 0.267722, ...up to a million more)
$STATES :{1, 3, 5, ...}
foo 

поэтому где-то в строке находятся результаты, а сразу после них - состояния, и я хочу сохранить результаты в списке и состояния в другом списке.

Я думаю, что мне нужно что-то вроде "read from $ RESULT :(" to ")" получить каждое число и нажать to list, то же самое для состояний, но я не знаю, как прочитать строку из "a" в "b" и токенизируйте его содержимое.

Ответы [ 6 ]

2 голосов
/ 03 марта 2012
int index = s.find("RESULT: (");
int index2 = s.find("$STATE");

int length = index2 - index;

if (index != string::npos) {
    temp = s.substr(index + 7, length - 8);
}
typedef tokenizer<char_separator<char> > tokenizer;
char_separator<char> sep(",() ");
tokenizer tokens(temp, sep);
for (tokenizer::iterator tok_iter = tokens.begin();
        tok_iter != tokens.end(); ++tok_iter) {
    basic_string<char> tempValue = *tok_iter;

    values.push_back(tempValue);

}
2 голосов
/ 01 марта 2012

вы можете использовать boost tokenizer : это библиотека только для заголовков, удобная для использования

1 голос
/ 01 марта 2012

Вы можете использовать strtok() библиотечную функцию - http://www.cplusplus.com/reference/clibrary/cstring/strtok.

1 голос
/ 01 марта 2012

Токенизация в C ++ часто выполняется с помощью getline, используется так: getline (входной поток, строка, где его сохранить, символ-разделитель);

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

0 голосов
/ 01 марта 2012
#include <string>
#include <vector>
using namespace std;

int main()
{
  //This is your source string
  string Source = "foo $RESULT :(0.2374742, 0.267722) $STATES :{1, 3, 5} fo0";
  //Get the $RESULT section of the string, encapsulated by ( )
  string Results = Source .substr(Source .find("(") + 1, (Source .find(")") - Source .find("(")) - 1);

  //Get the $STATES section of the string, encapsulated by { }
  string States = Source .substr(Source .find("{") + 1, (Source .find("}") - Source .find("{")) - 1);

  vector<double> ResultsList;
  vector<int> StatesList;

  //While the Results string still has remaining ", " token/seperators in it
  while(Results.find(", ") != string::npos)  
  {
    //Get the next value and insert it into the vector (converting it from string to float using atof)
    ResultsList.push_back(atof(Results.substr(0, Results.find(", ")).c_str()));
    //Crop that off the oringal string
    Results = Results.substr(Results.find(", ") + 2);  
  }
  //Push the final value (no remaning tokens) onto the store
  ResultsList.push_back(atof(Results.c_str()));

  //Exactly the same operation with states, just using atoi to convert instead
  while(States .find(", ") != string::npos)  
  {  
    StatesList.push_back(atoi(States.substr(0, States .find(", ")).c_str()));  
    States = States.substr(States.find(", ") + 2);  
  }  
  StatesList.push_back(atoi(States.c_str()));
  return 0;
}
0 голосов
/ 01 марта 2012

Найдите первую точность знака '(', а затем первый из ')' и получите подстроку между двумя индексами (сначала - начало, а длина - конец - начало), а затем вы можете сделать то же самое дляподстрока после первого знака ')' (для состояний).

temp_str = input_str

do twice {
    start    = findChar(temp_str, '(');
    end      = findChar(temp_str, ')')
    len      = end - start + 1
    result   = substr(temp_str, start, len);  

    save_result_to_file(result)

    temp_str = substr(temp_str, end + 1);
}

Не помню точные команды c ++, но вы обязательно их получите.

...