この関数は、分数を読み取り、それを配列に配置することになっています。ユーザーが「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;
}
std::istream::peek()
の使用には2つの問題があります。
std::ws
_:_(std::cin >> std::ws).peek()
_を使用します。std::istream::peek()
の結果はchar
ではありません。代わりに、それは_std::char_traits<char>::int_type
_(int
の派手なスペルです)です。結果は、たとえば、std::char_traits<char>::eof()
であり、_'0'
_の値が負の場合(プラットフォームがどこにあるかはわかりませんが、たとえば、私の面白いキャラクター) name _'ü'
_は、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;
}
_
このようにして、スラッシュのテストをカプセル化します。これを複数の場所で使用する必要がある場合、これは非常に便利です。