// // Example 8.10. Program to read a nonnegative integer one character // at a time and to print the integer or an error message // #include #include #include "boolean.h" int main(void) { int GetNonnegative(void); int nonneg_int; // nonnegative integer user enters cout << "Enter a nonnegative integer and press return.\n"; cout << "Do not use a sign and only type digits.\n"; cout << "Your nonnegative integer: "; nonneg_int = GetNonnegative(); if (nonneg_int < 0) cout << "Sorry, input line is invalid.\n"; else cout << "Your nonnegative integer is " << nonneg_int << ".\n"; return 0; } // // Function to read characters, verifying that they are digits, // and to accumulate the digits into a nonnegative integer. // The function does not check for integer overflow. // Pre: none // Post: A nonnegative integer was returned; or in the case // of an error, -1 was returned. // int GetNonnegative(void) { const int NEWLINE = '\n'; int nonneg_int; // nonnegative integer user enters boolean_t InputOK; // boolean value for continuing loop char ch; // character input from user cin >> ch; // skip over white space at beginning of line // Verify each character input is a digit and accumulate nonneg_int = 0; InputOK = TRUE; while (!isspace(ch) && InputOK) { if (isdigit(ch)) // in number, accumulate and cont. { nonneg_int = nonneg_int * 10 + ch - '0'; cin.get(ch); } else // Error: character not a digit { cout << ch << " is not a digit.\n"; InputOK = FALSE; } } // If number valid, make sure nothing else on line. while (ch != NEWLINE && InputOK) { if (isspace(ch)) cin.get(ch); else // Error: additional values on line { cout << "Have only one integer per line.\n"; InputOK = FALSE; } } // Error detected. Last processed character not NEWLINE if (!InputOK) { nonneg_int = -1; cin.ignore(256, '\n'); } return nonneg_int; }