2015-12-04 2 views
0

У меня есть код, приведенный ниже, чтобы поймать пользователей. Проблема заключается в том, когда время запускается из-за ввода пользователем символа или строки, он заставляет пользователя вводить данные дважды, прежде чем принимать его. Я не совсем уверен, почему он это делает, и надеялся, что кто-то сможет объяснить это мне. благодаря!Cin, который меня вводит дважды

bool valid_entry = false; 
while (!valid_entry) { 
    cin >> distanceTraveled; 
    while ((!(cin >> distanceTraveled)) ||(distanceTraveled==0)) { 
     cin.clear(); 
     cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); 
     cout << "ERROR: invalid Entry. Try again.\n\nHow far did ya go? "; 
     cin.clear(); 
     cin >> distanceTraveled; 
    } 

     valid_entry = true; 

} 

ответ

0

Это потому, что вы спрашиваете их дважды!

cin >> distanceTraveled; 
while ((!(cin >> distanceTraveled)) ... 

Try:

// assuming that distanceTraveled == 0 is invalid input 
while ((cin >> distanceTraveled) && (distanceTraveled == 0)) 

И если вы пытаетесь очистить любой другой вход они вошли на линии, вы можете использовать вместо getline.

std::string junk; 
std::getline(cin, junk); 
std::cout << "ERROR: invalid Entry. Try again.\n\nHow far did ya go? "; 

Так что код будет выглядеть следующим образом:

std::string junk; 
std::cout << "How far did you go? "; 
while ((cin >> distanceTraveled) && (distanceTraveled == 0)) 
{ 
    std::getline(cin, junk); 
    std::cout << "ERROR: invalid Entry. Try again.\n\nHow far did ya go? "; 
} 
+0

Спасибо .. это исправлено .. Я чувствую себя немым сейчас. –

+0

@Melissagoodall: Ты новичок в этом. Получение порядка запроса ввода и проверки правильности может быть действительно запутанным (даже для более опытных разработчиков) – AndyG

0

У меня аналогичная проблема, но я не совсем уверен, что вы делаете с getline и junk?

Вот что я поставил, я могу понять, почему он ничего не сделает, если вы не вводите дважды после ввода символа или специального символа, но как я могу сделать так, чтобы он продолжался только на действительном вводе?

Моя цель состоит в том, чтобы заставить консоль писать недопустимую запись, когда вводится буква, специальный символ, двойной (десятичный знак) или ничего, и продолжаются только в действительной записи.

Я попытался с помощью if ((programSelect > 0) && (programSelect <=4)), но если на входе пользователя 4.5 она будет работать программу 4, а затем сказать недопустимую запись:/

do 
    { 
     cout << "Please select a program to run: "; 
     cin >> programSelect; 
     if (cin >> programSelect) 
     { 
      invalid = false; 
      break; 
     } 
     else if (cin.bad()) 
     { 
      cin.clear(); 
      cin.ignore(INT_MAX, '\n'); 
      invalid = true; 
      cout << "Invalid entry.\n"; 
     } 
     else if (cin.eof()) 
     { 
      cin.clear(); 
      cin.ignore(INT_MAX, '\n'); 
      invalid = true; 
      cout << "Invalid entry.\n"; 
     } 
     else 
     { 
      cin.clear(); 
      cin.ignore(INT_MAX, '\n'); 
      invalid = true; 
      cout << "Invalid entry.\n"; 
     } 
    } while (invalid == true); 
    switch (programSelect) 
    { 
    case 1: 
     addItems(); 
     repeat = true; 
     break; 
    case 2: 
     bodyReview(); 
     repeat = true; 
     break; 
    case 3: 
     reviewAll(); 
     repeat = true; 
     break; 
    case 4: 
     repeat = false; 
     break; 
    default: 
     repeat = true; 
     break; 
    } 

Так что я придумал, как сделать эту проблему работу очень хорошо. Он запрещает пользователю вводить символы, специальные символы или десятичные знаки. Если вы можете подумать о более эффективном способе выполнения этой же задачи, дайте мне знать, это использует еще пару строк и переменных, чем хотелось бы, но выполняет требуемую задачу.

double userInput, inDec; 
    int programSelect, decTest; 
    bool invalid(true); 
    do 
    { 
     cout << "Please select a program to run: "; 
     cin >> userInput; 
     decTest = userInput; 
     inDec = userInput - decTest; 
     programSelect = userInput - inDec; 
     if ((inDec > 0) || (inDec < 0)) 
     { 
      cin.clear(); 
      cin.ignore(INT_MAX, '\n'); 
      invalid = true; 
      cout << "Invalid entry.\n"; 
     } 
     else if (!cin) 
     { 
      cin.clear(); 
      cin.ignore(INT_MAX, '\n'); 
      invalid = true; 
      cout << "Invalid entry.\n"; 
     } 
     else if ((programSelect > 0) && (programSelect <= 4)) 
     { 
      invalid = false; 
      break; 
     } 
     else 
     { 
      cin.clear(); 
      cin.ignore(INT_MAX, '\n'); 
      invalid = true; 
      cout << "Invalid entry.\n"; 
     } 
    } while (invalid == true); 

Это использует двойной для ввода данных пользователя, чтобы обнаружить, если они вводят десятичный или нет, и возвращает Invalid ошибки ввода, если они делают, а также позволяет избежать бесконечного цикла COUT, если пользователь вводит символ или специальный символ.

Смежные вопросы