2

How can i read in a specific format using cin? Example:-for reading a complex number, I would like the user to enter it as usual:x+yi, so i want something like this: cin>>x>>"+">>y>>"i"; But this is giving an error.What is the right way?Help greatly appreciated.

4

3 に答える 3

2

非常に簡単な解決策:

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;
}

stdin: 3 + 4i -> stdout: Complex: 3+4i

stdin: 1E4L1e3g-> stdout: Error: x=10000, plus=L, y=1000, img=g

stdin: a+3i -> stdout: Error: x=0, plus=, y=0, img=

stdin: 1e3+93E-2i -> stdout: Complex: 1000+0.93i

于 2013-02-15T19:19:34.920 に答える
2

漠然と関連する質問に対する私の回答によると、ストリームを使用した解析は通常悪い考えですが、実行できます。

文字列リテラルと文字リテラルを読み取ることができるコードを少し書きました。通常のストリーム読み取りと同様に、無効なデータを取得すると、ストリームのバッドビットが設定されます。これは、ワイド ストリームを含むすべてのタイプのストリームで機能するはずです。次の 4 つの関数をヘッダーに貼り付けます。

#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ようになりました。入力が完全に一致しない場合は、正しく入力できなかった他の型と同じように動作します。これは、最初の文字ではない文字列リテラルの空白にのみ一致することに注意してください。それはたった 3 つの機能であり、そのすべてが非常にシンプルです。

于 2013-02-15T19:33:04.383 に答える
1

をそのまま使用した方が確実に良いでしょう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
       }
   }
}

この操作は失敗する可能性があることに注意してください。

于 2013-02-15T19:26:26.353 に答える