C ++ ввод из консоли, сравнение целых чисел - PullRequest
1 голос
/ 07 августа 2011
bool choose() {
    int answer = 0;
    while(answer != 1 || answer != 2) {
        cout << endl << "Do you want to encrypt(enter 1) or decrypt(enter 2)?" << endl;
        cin >> answer;
    }
    if(answer == 1) return true;
    return false;
}

Как лучше всего читать со строки и сравнивать ввод с целыми числами?Я знаю способы cin, gets, getline(cin, answer).Что я должен использовать и почему?

В настоящее время этот способ не работает, потому что, когда я ввожу 1 или 2, он все еще остается в while.

Ответы [ 3 ]

10 голосов
/ 07 августа 2011

Ваше состояние неверно. По законам Де Моргана вместо этого следует использовать &&.

while(answer != 1 && answer != 2) {
5 голосов
/ 07 августа 2011

Вы правильно прочитали значение.Однако условие цикла неверно;это должно быть

while(answer != 1 && answer != 2)

Использование || делает условие всегда верным, поскольку ни одно число не равно ни 1, ни 2.

3 голосов
/ 07 августа 2011

Этот код является очень хорошим кандидатом для цикла do-while, и если вы используете его, вам не нужно инициализировать переменную answer.

int answer; //= 0; no need to initialize!
do {

  cout<<"Do you want to encrypt(enter 1) or decrypt(enter 2)?"<<endl;
  cin >> answer;

}while(answer != 1 && answer != 2);

И, конечно, вам нужно использовать &&, как уже указывали другие. : -)

Кстати, что произойдет, если пользователь введет любой нецелочисленный ввод, такой как hgjkhg? cin>>answer не сможет прочитать ввод, и он останется там навсегда, а флаг cin будет установлен как сбой, и cin не сможет прочитать дальнейший ввод. Это означает, что цикл никогда не завершится!

Чтобы избежать этого и сделать код более надежным и полным, вы должны написать его следующим образом:

int answer = 0; 
while(answer != 1 && answer != 2) {

  cout<<"Do you want to encrypt(enter 1) or decrypt(enter 2)?"<<endl;
  if ( !(cin >> answer) )
  {
    cin.clear(); //clear the failure flag if there is an error when reading!
    std::string garbage;
    std::getline(cin, garbage); //read the garbage from the stream and throw it away
  }
}

Да. Вы можете использовать цикл while вместо do-while. Все, что вам нужно добавить if(!(cin>>answer)) { ... } в ваш код. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...