我正在尝试拼接一个应该是复数的cin>> string;
。
我在处理复数的复杂类中工作。
我很难将字符串拼接到单独的组件中,以便我可以排列每个子字符串并将它们转换为对应于虚部或实数的相关双精度。
当我运行代码时,我认为如何找到字符串存在错误,它似乎超出了界限。
这是我的函数的标题和定义,重载>>
.
页眉:
friend istream& operator >>(istream& inputStream, Complex& amt);
定义:
istream& operator >>(istream& inputStream, Complex& amt){
cout<<"Please enter your complex number: ";
std::string str;
inputStream >> str;
//need different parts of string. imaginary, real, operand, 'i', and beginning sign.
std::size_t pos = str.rfind('-'|'+');
std::string str2 = str.substr(pos); // str2 = imaginarypart
if(str2.back()=='i'){
str2.erase( str2.end()-1 );
}
if(str2[0]=='+'){
str2.erase( str2.begin()-1 );
}
//str remains with realpart
return inputStream;
}
如果您只是在寻找一种以任何合适的格式输入复数的方法,我提出了一种更简单的解决方案,使用标准库中的std::complex
:http://en.cppreference.com/w/cpp/numeric/complex/operator_ltltgtgt
像这样:
#include <complex>
#include <string>
#include <iostream>
bool
inputComplexNumber (std::istream& is, std::complex<double>& c)
{
std::cout << "Please enter your complex number: ";
is >> c;
return is.good();
}
int
main ()
{
std::complex<double> c;
if (inputComplexNumber(std::cin, c))
std::cout << c.real() << (c.imag() > 0 ? "+" : "") << c.imag() << "i" << std::endl;
else
std::cout << "Bad complex number." << std::endl;
}
示例运行:
Please enter your complex number: (-69.1, 42.2)
-69.1+42.2i
Please enter your complex number: blah
Bad complex number.
如果你真的想坚持输入的漂亮格式,那么我建议你为这种迷你语言写一点语法,并从中派生出适当的扫描和解析函数。这是一些工作,但最终还是值得的。