The mysterious expression
q - p
is a
size_t.
Call
clear
and
ignore
only when an exclamation point has detected that the
istream
(in this case,
cin)
is unhealthy.
Send error messages to
cerr,
not to
cout.
//Ask currency code
cout<<"Enter your currency code (EUR, GBP, KWR, USD) for Currency " << q - p + 1 <<" :";
string code;
cin>>code;
//Check if the input for code is valid.
while( (code != "USD" && code != "EUR" && code != "KWR" && code != "USD") ){
cout <<"Invalid input. Chose EUR, GBP, KWR or USD. Try again.\n"
<<"Enter your currency code (EUR, GBP, KWR, USD) for Currency " << q - p + 1 << " :";
cin.clear();
cin.ignore();
cin>>code;
}
for (;;) {
cout << "Enter your currency code (EUR, GBP, KWR, USD) for Currency " << q - p + 1 <<" :";
string code;
cin >> code;
if (!cin) {
cerr << "Could not input a string. Try again.\n";
cin.clear();
//Discard everything up to and including the '\n'.
cin.ignore(INT_MAX, '\n');
continue;
}
if (code == "USD" || code == "EUR" || code == "KWR" || code == "USD") {
break;
}
cerr << "Invalid input. Choose EUR, GBP, KWR or USD. Try again.\n";
}
v
is a
vector<int>.
i
is born containing garbage.
If the first attempt at input fails,
the first call to
push_back
will copy garbage into the vector.
Then the comparison of
i
to zero in the
while
statement will behave unpredictably.
The check for input error came too late to help us.
No reason to keep
i
alive after the loop is over.
The first comment is not true.
Output a newline at the end of the program.
It’s a good thing that the container is a
vector,
not a
list,
because we can’t subtract 1 from a
list
iterator.
//0 will be eliminated from the vector
int i; //uninitialized variable
do // read input until 0 or !cin
{
cin >> i;
v.push_back (i);
}
while (i);
if (!cin) //check for input error
{
cerr << "Input failed";
exit(EXIT_FAILURE);
}
cout << "Please enter any number of integers (enter 0 to exit):\n";
//print out the results
//v.size - 1 to eliminate the 0
cout << "The vector contains " << v.size() - 1 << " numbers.\n";
//v.end - 1 to eliminate the 0
for (vector<int>::const_iterator it = v.begin(); it != v.end() - 1; ++it)
{
cout << *it << " ";
}
Don’t examine or use the value of i
until
after
we have verified that the input was successful.
for (;;) {
int i; //uninitialized variable
if (!(cin >> i)) {
cerr << "Input failed.\n";
exit(EXIT_FAILURE);
}
if (i == 0) {
break; //Don't store the 0 into the vector.
}
v.push_back(i);
}
//Print out the results.
cout << "The vector contains " << v.size() << " numbers.\n";
for (vector<int>::const_iterator it = v.begin(); it != v.end(); ++it) {
cout << *it << " ";
}
cout << "\n";