重载>>以分数读取

Overloading >> to read in fractions

本文关键字:gt 读取 重载      更新时间:2023-10-16

可能的重复项:
分数类C++的重载>>

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

打印出说明,然后提示输入。 如下所示。

输入您的第一个分数:8/27

现在的重点是我们应该超载 istream>>以便能够将 8 作为分子放入分数类和 27 作为分母,但我一生都无法弄清楚如何。 我尝试过 .getline 并尝试从 char 转换为 int,我已经让所有内容都可以输入 8 然后输入 27,但无法将"8/27"作为输入工作。 关于我应该去哪里的任何建议?

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

您想要读取一个整数

,忽略一个字符,然后读取另一个整数。

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

以下是一些测试代码供您填补空白:

#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;
}

这样的事情就可以了...

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;
}

只是为了强制适应 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
}