Я должен согласиться с тем, что проверка номеров телефонов является трудной задачей. Что касается этой конкретной проблемы, я бы изменил регулярное выражение из
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/
на
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
, поскольку единственным лишним элементом, который становится ненужным, является последнее тире / пробел.
Это довольно неуклюже, так как вам, по сути, нужно дважды проверить условия. (Ваша конкретная проблема в неправильном логическом тесте: вам нужно &&
, а не ||
).
. Вместо этого используйте функцию с проверкой:
int getAction(void)
{
for (;;)/*infinite loop idiom*/{
int action; /*scope as local as possible*/
cin >> action;
if (action >=1 || action <= 4){
return action; /*this is ok, so return*/
}
cout << "I'm sorry, but I'm not sure what you want to do. Please tell me again using the corresponding number. (1/2/3/4)\n\n";
}
}
изменить
while ((action != 1) || (action != 2) || (action != 3) || (action != 4)); // (1)
на
while ((action != 1) && (action != 2) && (action != 3) && (action != 4)); // (2)
Анализ:
, если action == 1
(1) будет оценивать to
while(false || true || true || true)
=>
while (true)
(2) будет оценивать
while(false && true && true && true)
=>
while (false)
cin >> action
, иначе он будет постоянно использовать последнее успешно введенное значение. Легкий способ сделать это будет while( cin && (action != 1) &&
...
– M.M
9 February 2015 в 09:04
вместо «или» условие try »и« условие, что оно решит вашу проблему
Он останавливается только по умолчанию, потому что вы запрашиваете ввод и назначаете действие.
Вы должны действительно инициализировать действие перед циклом. После того, как действие было назначено 1, 2, 3, 4, он будет работать навсегда, поскольку это то, что говорит код. Вы никогда не меняете свое значение снова, поэтому оператор while просто продолжает вращаться.
В ваших заявлениях о случаях вам нужно выполнить любое действие, и если вы хотите выйти из цикла, добавьте флаг для выхода на время , Break просто отмечает конец оператора case, чтобы остановить его выполнение в следующем.