0

well, this is my code:

while(!isdigit(c) || num.length() < 4){
    cout << "Enter your four digit pin: ";
    cin >> num;
       
        for(i = 0;i < num.length(); i++){ 
                c = num.at(i);
                    if (isdigit(c)){
                         pin[i] = atoi(num.substr(i, 1).c_str());
                    }
        }
        
        if(!isdigit(c) || num.length() < 4){
            cout << "Invalid Pin." << endl;
        }
}

and this should be the output:

Enter your 4 digit pin number: qwerty

Invalid pin.

Enter your 4 digit pin number: 43x1

Invalid pin.

Enter your 4 digit pin number: 432

Invalid pin.
Enter your 4 digit pin number: 4321

Select Option ([L]ist Titles, [D]isplay Item, [A]dd Item, [Q]uit):

**but instead i get this:
Enter your 4 digit pin number: 43x1

Invalid Pin.
Select Option ([L]ist Titles, [D]isplay Item, [A]dd Item, [Q]uit):

**whenever i enter "43x1" it does show "Invalid Pin" but it still displays the menu options

how can i fix this?

3
Contributors
5
Replies
8
Views
8 Years
Discussion Span
Last Post by kz07
0

Don't understand the while loop. You should do the digit check in the for loop. Also show the code where you write the 'menu'. This doesn't make much sense.....

0

Logic of above program is not correct.
In posted program while loop is not correct value of variable c is not known, and after for loop c will contain last value of string.
It should be like this.

bool isValidPin = false;

while(!isValidPin) {
    isValidPin = true;
    cout << "Enter Your 4 digit pin";
    cin >> num;

   for (int i = 0; i < num.length(); ++i) {
    char c = num.at(i);
    if (!isdigit(c)) {
      isValidPin = false;
      break;
   }
  }
  if(!isValidPin) {
   cout << "Invalid Pin";
  }
}

Edited by Dani: Formatting fixed

0
cout << "Enter your four digit pin: ";
    cin >> num;
       
        for(i = 0;i < num.length(); i++){ 
          c = num.at(i);
          if (isdigit(c)){
             pin[i] = atoi(num.substr(i, 1).c_str());
             }else{
                    cout << "Invalid Pin!" << endl;
             }
        }
    
do {         
     
     displayMenu();
     cin >> ans;
     cout << endl;
     ans = tolower (ans);
     
     switch (ans){
            case 'l':
                 listTitles();
                 break;
            case 'd':
                 displayItem(pin);
                 break;
            case 'a':
                 addNewItem(pin);
            case 'q':
                 break;
            default:
                 cout << "Invalid Option" << endl;
                break;                
                   
            }
}while(ans != 'q'); 

      return 0;
}
0

This will always show the menu even after an Invalid Pin, because you will always enter the do - while loop where displayMenu is the first function that will be called.
One way to fix this:

bool validPin = false;
while( !validPin )
{
  cout << "Enter your four digit pin: ";
  cin >> num;
  validPin = true;     
  for(i = 0;i < num.length(); i++){ 
    c = num.at(i);
    if (isdigit(c)){
       pin[i] = atoi(num.substr(i, 1).c_str());
       }else{
        cout << "Invalid Pin!" << endl;
        validPin = false;
    }
  }
}

Oh and you don't check for a 4-number digit anymore

Edited by disc: n/a

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.