Строка до двух чисел - PullRequest
0 голосов
/ 29 марта 2019

Мне нужна помощь в создании функции, которая принимает строку, содержащую два числа, разделенных "" (пробел). Эти два числа затем передаются другой функции для создания из нее дробного формата.

Я пробовал оператор if, определяющий местоположение пробела, затем создавал две подстроки, содержащие значения до и после символа пробела соответственно.

Fraction::Fraction(string frac)
    {
            int t, b;
        for (int i = 0; i < frac.size(); i++)
        {
            if (frac.substr(i, 1)==" ")
            {
            t = stoi(frac.substr(0,i-1)); //number before space
            b = stoi(frac.substr(i + 1)); //number after space
            break;
            }
        }
        this->setFraction(t, b);
    }

Например, строка s = "1 2" преобразуется в t = 1 и b = 2.

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

вы находитесь в C ++, просто используйте std :: istringstream :

std::string s("1 2");
std::istringstream ss(s);
int t, b;

if (ss >> t >> b)
  std::cout << t << '/' << b << std::endl;
else
  std::cerr << "invalid form " << s << std::endl; 

иначе, если хотите, вы можете использовать C sscanf на string::c_str()

std::string s("1 2");
int t, b;

if (sscanf(s.c_str(), "%d %d", &t, &b) == 2)
  std::cout << t << '/' << b << std::endl;
else
  std::cerr << "invalid form " << s << std::endl; 

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

Но я призываю вас всегда проверять, есть ли у вас результат, а не предполагать / надеяться, что вы его получили

0 голосов
/ 29 марта 2019

Мое решение:

int t, b;
    for (std::string::size_type i = 0; i < frac.length(); ++i)
    {
        if (frac[i] == ' ')
        {
            t = stoi(frac.substr(0, i));
            b = stoi(frac.substr(i+1));            
            break;
        }
    }
    this->setFraction(t, b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...