我怎样才能使用CIN特定格式读? 例如: - 对于读复数,我想用户输入它像往常一样:X +易,所以我想是这样的:CIN >> X >>“+” >> Y >>“我”; 但是,这给人一种error.What才是正道?帮助非常感谢。
Answer 1:
一个非常简单的解决方案:
char plus,img;
double x,y;
cin>> x >> plus >> y >> img;
if (plus!='+' || img!='i') ...error
在“现实生活”的代码你建立/使用一个class complex
,和过载操作>>.
我尝试在Ideone: http://ideone.com/ZhSprF
#include <iostream>
using namespace std;
int main()
{
char plus{},img{};
double x{},y{};
cin>> x >> plus >> y >> img;
if (plus!='+' || img!='i')
cout << "\nError: "<< "x=" << x <<", plus=" << plus <<", y=" << y <<", img=" << img;
else
cout << "\nComplex: " << x << plus << y << img;
return 0;
}
标准输入: 3 + 4i
- >标准输出: Complex: 3+4i
标准输入: 1E4L1e3g
- >标准输出: Error: x=10000, plus=L, y=1000, img=g
标准输入: a+3i
- >标准输出: Error: x=0, plus=, y=0, img=
标准输入: 1e3+93E-2i
- >标准输出: Complex: 1000+0.93i
Answer 2:
按照我上隐约相关的问题的答案 ,同流解析通常是一个坏主意,但可以做到:
我编写了一段代码,可以在字符串和字符阅读。 像正常流中读取数据,如果它得到无效的数据它集流badbit。 这应该适用于所有类型的数据流,包括宽流。 在报头粘这四个功能:
#include <iostream>
#include <string>
#include <array>
#include <cstring>
template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e(&literal)[N]) {
std::array<e, N-1> buffer; //get buffer
in >> buffer[0]; //skips whitespace
if (N>2)
in.read(&buffer[1], N-2); //read the rest
if (strncmp(&buffer[0], literal, N-1)) //if it failed
in.setstate(in.rdstate() | std::ios::badbit); //set the state
return in;
}
template<class e, class t>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e& literal) {
e buffer; //get buffer
in >> buffer; //read data
if (buffer != literal) //if it failed
in.setstate(in.rdstate() | std::ios::badbit); //set the state
return in;
}
//redirect mutable char arrays to their normal function
template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, e(&carray)[N]) {
return std::operator>>(in, carray);
}
并且它将使输入字符很容易:
if (cin>>x>>"+">>y>>"i";) {
// read correctly
}
概念证明 。 现在,您可以cin
字符串和字符,如果输入的是不完全匹配,它的作用就像是没有正确输入任何其他类型。 请注意,这只是在字符串是不是第一个字符匹配空白。 它只有三个功能,所有这些都是死脑筋简单。
Answer 3:
这将是当然最好只使用std::complex
。
下面是说明我的意见伪代码:
struct Complex { double real, imag; }
istream& operator>> (Complex& c, istream& str)
{
// read until whitespace
char C;
string Buffer;
enum { READING_REAL, READING_PLUS, READING_IMAG }
State = READING_REAL;
C = str.peek();
while (/* C is not whitespace */)
{
// actually read C
switch(State) {
case READ_REAL:
// check if it fits allowed double syntax
// continue until first double is read
/* when it is
c.real = parsedouble(Buffer);
Buffer.clear();
State = READ_PLUS;
*/
case READ_PLUS:
// accept plus sign
case READ_IMAG:
// read 2nd double
}
}
}
请注意,此操作可能会失败。
文章来源: Reading in a specific format with cin