https://rentry.org/PPP2_p360

// Code derived from Stroustrup's PPP2 book
// § 10.7.1 Breaking the problem into manageable parts
//  -and beginning on p 360

#include <iostream>
#include <locale>
#include <stdexcept>
#include <string>

using namespace std;

void error(const string s) { throw runtime_error(s); }
void error(const string s1, const string s2) { error(s1 + s2); }

//------------------------------------------------------------------------------

void skip_to_int()
{
  if (cin.fail()) {  // we found something that wasn’t an integer
    cin.clear();     // we’d like to look at the characters now

    for (char ch; cin >> ch;) {  // throw away non-digits
      if (isdigit(ch) || ch == '-') {
        cin.unget();  // put the digit back, so that we can read the number
        return;
      }
    }
  }

  error("no input");  // eof or bad; give up
}

int main()
try {
  cout << "Please enter an integer in the range 1 to 10 (inclusive):\n";
  int n = 0;

  while (true) {
    if (cin >> n) {  // we got an integer; now check it

      if (1 <= n && n <= 10)
        break;  // exit loop on good input

      cout << "Sorry " << n
           << " is not in the [1:10] range; please try again\n";

    } else {
      cout << "Sorry, that was not a number; please try again\n";

      skip_to_int();
    }
  }

  // if we get here n is in [1:10]

} catch (exception& e) {
  cerr << "error: " << e.what() << '\n';
  return 1;

} catch (...) {
  cerr << "Oops: unknown exception!\n";
  return 2;
}

build & run:

g++ -std=c++20 -O2 -Wall -pedantic ./ch_10/main_p360.cpp && ./a.out

PrevUpNext

Edit
Pub: 07 Apr 2023 22:21 UTC
Edit: 03 May 2023 10:01 UTC
Views: 363