如何重载cin>> c ++中的运算符输入一小部分未知大小/字符?具体来说,该人可以输入1/2或12/4或1/100,并且必须能够接受它们中的任何一个并将它们输入到分数对象中的分子和分母中。是否有一个简单的命令来确定一个字符在字符串中的位置,然后在它之前和之后做一些不同的字符?
输入分子和分母斜线后,我不能让人命中返回/输入。如4(输入)/(输入)15(输入)。必须将它们输入一行并从那里进行操作。
注意:我已经查看了这个网站上的类似问题,但似乎没有一个问题涉及不是由单个int分子和分母组成的分数。
答案 0 :(得分:2)
这是一个使用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;
}
答案 1 :(得分:1)
只需使用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
更改为char。
EDIT2:如果你有一个Fraction结构,如下所示,
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,并且可能需要在从in
返回operator>>
对象之前进行一些错误检查。
答案 2 :(得分:0)
string
,string.find()
查找/
,string
,并使用以太stringstream
,atoi()
或其他任何内容将部分转换为数字(抱歉4和5,无法抗拒自己)
注意:当然,您应该在operator>>
课程的重载fraction
内进行此操作。
答案 3 :(得分:0)
您希望在分子和分母之间读取和匹配/
字符,因此您需要缺少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;
}
该函数(或类似的东西)确实应该是标准库的一部分,但它很容易自己添加。