8

この関数は、分数を読み取って配列に配置することになっています。ユーザーが「0」を入力すると、関数は終了するはずです。cin.peek() 関数を使用してこれを実行しようとしていますが、実行は常に if ステートメントに入り、ユーザーは終了できません。

これを適切にコーディングするにはどうすればよいですか (私は peek() を使用しないことにオープンです。これが最も簡単な方法だと思いました。)

ありがとう!

void enterFrac(Fraction* fracs[], int& index)
    {
        int n, d;
        char c, slash;
        cout << "Enter fractions (end by entering a 0): ";
        c = cin.peek();

        if ( c != '0')
        {
            cin >> n >> slash >> d;
            Fraction* f = new Fraction();
            f->num = n;
            f->den = d;
            fracs[index] = f;
            index++;
        }
    }

ただし、peek() のこのテストは機能します。

#include <iostream>
using namespace std;

int main () {
  char c;
  int n;
  char str[256];

  cout << "Enter a number or a word: ";
  c=cin.peek();

  if ( (c >= '0') && (c <= '9') )
  {
    cin >> n;
    cout << "You have entered number " << n << endl;
  }
  else
  {
    cin >> str;
    cout << " You have entered word " << str << endl;
  }

  return 0;
}
4

1 に答える 1

16

の使用には 2 つの問題がありますstd::istream::peek()

  1. この関数は次の文字にアクセスし、先頭の空白をスキップしません。std::wsたとえば、マニピュレータ:を使用して、次の文字が何であるかを判断する前に、先頭の空白をスキップしたい場合があります(std::cin >> std::ws).peek()
  2. からの結果は でstd::istream::peek()はありませんchar。代わりに、それはstd::char_traits<char>::int_type(の凝った綴りですint)です。結果は、たとえば、std::char_traits<char>::eof()の値が'0'たまたま負の場合 (プラットフォームがどこにあるかはわかりませんが、たとえば、私の名前の変な文字は、が署名'ü'されているプラ​​ットフォームでは負の値です)。char正しい結果も得られません。つまり、通常は の結果を の結果と比較しますstd::istream::peek()std::char_traits<char>::to_int_type()つまり、次のようなものを使用します。std::cin.peek() == std::char_traits<char>::to_int_type('0')

つまり、プログラムは、スラッシュで区切られた分母と分母を正常に読み取ることができたかどうかをチェックしません。たとえば、次のようなものを使用して、読み取りが成功したことを常に確認したい

if ((std::cin >> nominator >> slash >> denominator) && slash == '/') {
    ...
}

娯楽のためだけに、実際に文字がスラッシュであることをテストするためのマニピュレーターを作成できます。

std::istream& slash(std::istream& in) {
    if ((in >> std::ws).peek() != std::char_traits<char>::to_int_type('/')) {
        in.setstate(std::ios_base::failbit);
    }
    return in;
}

このようにして、スラッシュのテストをカプセル化します。これを複数の場所で使用する必要がある場合、これは非常に便利です。

于 2012-11-21T21:04:08.120 に答える