cin 未知大小的一小部分

cin a fraction of unknown size?

本文关键字:小部分 未知 cin      更新时间:2023-10-16

如何在 c++ 中重载 cin>> 运算符以输入未知大小/字符的一小部分?具体来说,这个人可以输入 1/2 或 12/4 或 1/100,并且它必须能够接受其中任何一个并将它们输入到分数对象的分子和分母中。有没有一个简单的命令来确定字符在字符串中的位置,然后对它之前和之后的字符执行不同操作?

而且我不能让这个人在输入分子和分母斜杠后点击回车/回车。如 4(输入)/(输入)15(输入)。它们必须在一行中输入并从那里进行操作。

注意:我已经在这个网站上看过类似的问题,但似乎没有一个涉及不是由单个整数分子和分母组成的分数。

下面是一个非常简单的提取示例,使用 istringstream 进行提取

请注意,阅读时不得放置空格; 例如:123/34如果您想要它,只需使用 : std::cin >> numerator >> dummy_char >> denominator;

#include <iostream>
#include <sstream>
#include <string>
int main()
{
    std::string str( "123/455" );
    std::istringstream is( str );
    std::size_t i, j = 0;
    if( !(is >> i) ) return 1; // extract
    is.get(); // get the '/'
    if( !(is >> j) ) return 1; // extract
    std::cout << i << '/' << j;
}

只需使用 cin 即可读取一个 int、斜杠和另一个 int。

int num, den;
string slash;
cin >> num >> slash >> den;
// optionally check that slash contains a slash if you don't trust the user
// if("/" != slash) abort();

编辑:我刚刚尝试过这个,它仅在分母之前的斜杠后面有一个空格时才有效。如果没有空格,您可以将slash更改为字符。

编辑2:如果您有如下所示的分数结构,

struct Fraction
{
    int num, den;
};

然后,您可以重载operator >>直接读取分数。

istream& operator>>(istream &in, Fraction &f)
{
    string slash;
    return in >> f.num >> slash >> f.den;
}
// in main or somewhere
Fraction f;
cin >> f;

和以前一样,如果没有空格,您可以将slash更改为 char,并且您可能希望在从 operator>> 返回 in 对象之前进行一些错误检查。

  1. 将整个东西加载为string
  2. 使用string.find()查找/
  3. 像在C++中拆分字符串中所述拆分string,并使用以太stringstreamatoi()或其他任何东西将部分转换为数字,
  4. ???
  5. 利润。

(对不起4和5,无法抗拒自己)

注意:当然,您应该在fraction类的重载operator>>中执行此操作。

你想读取和匹配分子和分母之间的/字符,所以你需要缺少的operator>>(istream&, char)函数:

std::istream &operator>>(std::istream &in, char ch) {
    while (std::isspace(in.peek())) in.get();
    if (in.peek() == ch)
        in.get();
    else
        in.setstate(std::ios_base::failbit);
    return in;
}
std::istream &operator>>(std::istream &in, fraction &fr) {
    in >> fr.num >> '/' >> fr.denom;
    return in;
}

该函数(或类似的东西)确实应该是标准库的一部分,但是自己添加它很容易。