C ++ Что мне здесь не хватает? DO - Хотя [дублировать]

Я должен согласиться с тем, что проверка номеров телефонов является трудной задачей. Что касается этой конкретной проблемы, я бы изменил регулярное выражение из

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/

на

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

, поскольку единственным лишним элементом, который становится ненужным, является последнее тире / пробел.

-5
задан Vince 9 February 2015 в 08:56
поделиться

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";
    }
}
0
ответ дан Bathsheba 16 August 2018 в 02:05
поделиться

изменить

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)
3
ответ дан Ganesh Kamath - 'Code Frenzy' 16 August 2018 в 02:05
поделиться
  • 1
    Также проверьте успех на cin >> action, иначе он будет постоянно использовать последнее успешно введенное значение. Легкий способ сделать это будет while( cin && (action != 1) && ... – M.M 9 February 2015 в 09:04

вместо «или» условие try »и« условие, что оно решит вашу проблему

0
ответ дан Ray Innov 16 August 2018 в 02:05
поделиться

Он останавливается только по умолчанию, потому что вы запрашиваете ввод и назначаете действие.

Вы должны действительно инициализировать действие перед циклом. После того, как действие было назначено 1, 2, 3, 4, он будет работать навсегда, поскольку это то, что говорит код. Вы никогда не меняете свое значение снова, поэтому оператор while просто продолжает вращаться.

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

0
ответ дан Rory McKinnel 16 August 2018 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: