Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Input (istream) error testing

Input (istream) error testing

Scheduled Pinned Locked Moved C / C++ / MFC
testingbeta-testinghelpquestion
6 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H Offline
    H Offline
    hain
    wrote on last edited by
    #1

    I want to test for an invalid character in entered numeric (integer) data, (e.g., enter "d23", instead of "123") In the following code, the do loop loops infinitely after an invalid entry, "d23". Seems like cin is not stopping to accept more input the second time around. Can anyone tell me what I'm doing wrong? Thanks, Tom ------------------------ #include using namespace std; void main() { int x; cout << "Type in an integer value: "; cin >> x; while (cin.fail()) { cin.clear(); cout << "Invalid character.\n Type in an integer value: "; cin >> x; } cout << x << endl; }

    D 1 Reply Last reply
    0
    • H hain

      I want to test for an invalid character in entered numeric (integer) data, (e.g., enter "d23", instead of "123") In the following code, the do loop loops infinitely after an invalid entry, "d23". Seems like cin is not stopping to accept more input the second time around. Can anyone tell me what I'm doing wrong? Thanks, Tom ------------------------ #include using namespace std; void main() { int x; cout << "Type in an integer value: "; cin >> x; while (cin.fail()) { cin.clear(); cout << "Invalid character.\n Type in an integer value: "; cin >> x; } cout << x << endl; }

      D Offline
      D Offline
      David Crow
      wrote on last edited by
      #2

      hain wrote:

      cin >> x; while (cin.fail())

      What about:

      while (! (cin >> x))
      {
      cin.clear();
      while (cin.get() != '\n');
      }

      "Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman

      "To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne

      G H 2 Replies Last reply
      0
      • D David Crow

        hain wrote:

        cin >> x; while (cin.fail())

        What about:

        while (! (cin >> x))
        {
        cin.clear();
        while (cin.get() != '\n');
        }

        "Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman

        "To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne

        G Offline
        G Offline
        gentleguy
        wrote on last edited by
        #3

        dear friend why we can't use cin.get directly here? why we use while loop here? thanks

        Li Zhiyuan

        1 Reply Last reply
        0
        • D David Crow

          hain wrote:

          cin >> x; while (cin.fail())

          What about:

          while (! (cin >> x))
          {
          cin.clear();
          while (cin.get() != '\n');
          }

          "Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman

          "To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne

          H Offline
          H Offline
          hain
          wrote on last edited by
          #4

          Thanks David, terrific, that works perfectly! Problem is, your solution is mysterious to me... I don't understand it. Why doesn't the get() move the stream pointer forward (after an error), so that by the time we get back to cin>>x, the extraction starts after the '\n' (i.e., nothing is extracted)? Thanks again, Tom

          D 1 Reply Last reply
          0
          • H hain

            Thanks David, terrific, that works perfectly! Problem is, your solution is mysterious to me... I don't understand it. Why doesn't the get() move the stream pointer forward (after an error), so that by the time we get back to cin>>x, the extraction starts after the '\n' (i.e., nothing is extracted)? Thanks again, Tom

            D Offline
            D Offline
            David Crow
            wrote on last edited by
            #5

            cin >> x stops at the first whitespace, so cin.get() is used to get passed all that.

            "Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman

            "To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne

            H 1 Reply Last reply
            0
            • D David Crow

              cin >> x stops at the first whitespace, so cin.get() is used to get passed all that.

              "Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman

              "To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne

              H Offline
              H Offline
              hain
              wrote on last edited by
              #6

              I should have been able to figure that out! Thanks! Tom

              1 Reply Last reply
              0
              Reply
              • Reply as topic
              Log in to reply
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes


              • Login

              • Don't have an account? Register

              • Login or register to search.
              • First post
                Last post
              0
              • Categories
              • Recent
              • Tags
              • Popular
              • World
              • Users
              • Groups