2015-04-13 7 views
0

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

#include<iostream> 
#include<string> 
#include<sstream> 
using namespace std; 

int main() 
{ 
    string inp; 
    float n1,n2; 
    string s1,s2; 

    cout<<"Enter your string"<<endl; 
    getline(cin,inp); 

    stringstream ss; 
    ss.str(inp); 

    ss>>s1>>n1>>s2>>n2; 
} 

Программа будет работать успешно, если пользователь вводит в правильном формате т.е. добавить 2 и 3, вычесть 8 из 12 Но проблема в двух случаях

  1. Если пользователь входит в другой формат, например «7 плюс 6».
  2. Даже в правильном формате, но только одно число «квадратный корень из 25».

Есть ли решение, которое может извлекать поплавки независимо от положения или количества поплавков?

Благодаря

+1

['find()'] (http://en.cppreference.com/w/cpp/string/basic_string/find) и ['substr()'] (http://en.cppreference.com/ w/cpp/string/basic_string/substr) – NathanOliver

+0

@NathanOliver Huh? Что вы делаете, чтобы «найти()» точно? Каждая цифра одна за другой? – Barry

+0

Вы должны, вероятно, читать каждое слово по одному и использовать конечный автомат. Таким образом, вы всегда будете знать, когда ожидается следующий номер. –

ответ

0

Если то, что вы хотите сделать, это в буквальном смысле извлечь float с, вы можете воспользоваться тем, что std::stof дополнительно может вернуться, когда он кончает, которые вы можете использовать, чтобы определить, является ли всем «слово "является float (например, для„6с“) и поймать invalid_argument для слов, которые, безусловно, не поплавков (например, для„плюс“):

std::vector<float> getFloats(const std::string& s) { 
    std::istringstream iss(s); 
    std::string word; 
    std::vector<float> result; 

    size_t pos = 0; 
    while (iss >> word) { 
     try { 
      float f = std::stof(word, &pos); 
      if (pos == word.size()) { 
       result.push_back(f); 
      } 
     } 
     catch (std::invalid_argument const&) { 
      // no part of word is a float 
      continue; 
     } 
    } 

    return result; 
} 

При том, что getFloats("7 plus 6") дает {7, 6} и getFloats("square root of 25") дает {25}.

Смежные вопросы