重载>>阅读分数

时间:2012-12-13 08:42:33

标签: c++ overloading cin

  

可能重复:
  overloading >> for a fraction class C++

所以我需要从命令行读一行。

打印指令,然后提示输入。如下所示。

输入您的第一部分:8/27

现在关键是我们应该重载istream>>能够将8作为分子投入分数类,将27作为分母,但我不能为我的生活弄清楚如何。我已经尝试过.getline并尝试从char转换为int,我已经完成了所有工作输入8然后27,但是无法将'8/27'作为输入工作。关于我应该去哪里的任何建议?

3 个答案:

答案 0 :(得分:2)

您可以从std::istream获取任何数据并将其放入任何类型,只要它可以转换。

你想读取一个整数,忽略一个char,然后读取另一个整数。

对于您要忽略的那个,请将其读入虚拟变量。

这里有一些测试代码供您填补空白:

#include <sstream>
#include <iostream>

class Fraction {};

using std::istream;

istream& operator>>(istream& is, Fraction& fraction) {
    int numerator;
    int denominator;
    char dummy;

    is >> numerator;
    is >> dummy;
    is >> denominator;
}

using std::iostringstream;
using std::cout;
using std::endl;

int main() {
    iostringstream input;
    input << "8/27";

    Fraction fraction;
    input >> fraction;

    return 0;
}

答案 1 :(得分:1)

这样的事情会做到......

struct Fraction
{
    int numerator;
    int denominator;
};
std::istream & operator >> ( std::istream &s, Fraction & f ) {
    s>>f.numerator;
    char c;
    s>>c;
    s>>f.denominator;
    return s;
}


int main()
{
    std::stringstream s( "1/3 3/4");
    Fraction f1, f2;
    s>>f1;
    s>>f2;

    return 0;
}

答案 2 :(得分:1)

这里强制适合std :: regex类:)。

int main() {
#ifdef APPROACH_1
    int num, den;
    char c;
    std::cin >> num >> c >> den;
    std::cout << static_cast<double>(num)/den;

#else
    std::regex regex("( *)([0-9]+)( *)/( *)([0-9]+) *");
    std::string inputstr;
    std::smatch match;

    std::cout << "Enter string";
    std::getline(std::cin, inputstr);

    bool matched = std::regex_search(inputstr, match, regex);

    if(matched)
    {
        std::string nums = std::string(match[2].first, match[2].second);
        std::string dens = std::string(match[5].first, match[5].second);

        std::cout << nums << " " << dens << std::endl;

        std::stringstream ss1(nums), ss2(dens);
        int num, den;

        ss1 >> num;
        ss2 >> den;

        std::cout << static_cast<double>(num)/den;
    }
    else
        std::cout << "Oops" << std::endl;
#endif

}