1

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

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

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

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

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

4

3 回答 3

2

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;
}
于 2012-12-13T09:18:51.003 回答
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;
}
于 2012-12-13T09:15:32.517 回答
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

}
于 2012-12-13T09:27:04.470 回答