C ++: проверка строки с множеством условий - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь написать проверку для строки, которая соответствует следующим рекомендациям:

  1. Может быть алфавит

  2. Может быть '.' или ','

  3. Может иметь пробел

  4. НЕ МОЖЕТ быть пустым

Так, например, «Боб», «Боб Смит» и «Боб Смит-младший» должно быть хорошо, в то время как "" или просто нажатие клавиши ввода не должно.

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

Я пробовал несколько разных способов циклического прохождения для проверки, и, если я правильно понимаю разрыв, я считаю эта структура должна работать. Тем не менее, ввод простой строки, такой как "Bob", не проходит тесты. Я также не уверен, как убедиться, что пользователь не может просто нажать пробел или нажать клавишу ввода.

std::string patronName()
    {
        std::string name;
        bool loopFlag = true;

        do
        {
            std::cout << "Please enter the name of the Patron: ";
            std::getline(std::cin, name);

            for (int i = 0; i < name.length(); i++)
            {
                if (!isalpha(name[i]) || !ispunct(name[i]) || !isspace(name[i]) || name.empty())
                {
                    std::cout << "Invalid name entry." << std::endl;
                    break; //If we're invalid, doesn't matter what the rest is
                }
                loopFlag = false;
            }

        }
        while(loopFlag);

        return name;
    }

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

1 Ответ

3 голосов
/ 03 мая 2019

Если char не является альфа-версией или не является буквой, или не является spece, то он недействителен.

Буква c не является пробелом, поэтому ваше условие выполнено.

Попробуйте && вместо ||.Если char не является альфа-версией И это не является пунктуацией И это не пробел, то он недействителен.

Я бы посмотрел на рефакторинг вашего кода, чтобы отделить проверку от другого кода.

bool isValid(const std::string& str)
{
    // Assume the string is valid - up to us to prove it is not...
    bool result = true;
    // Assume the stringis all spaces - up to us to mark when we see a valid non whitespace
    bool allSpaces = true;

    size_t len = str.length();
    for(size_t i = 0; i < len; i++)
    {
        unsigned char ch = (unsigned char)str[i];
        // alpha and punctuation are ok and mean that the string has
        // something other than a space.
        if (isalpha(ch) || ispunct(ch))
        {
          allSpaces = false;
          continue;
        }
        // space is ok - as long as we have something else too...
        if (isspace(ch))
        {
            continue;
        }
        // not a space, allowed punctuation or an alpha ?
        // must be an error!
        result = false;
        break;
    }
    if (allSpaces)
    {
        result = false;
    }
    return result;
}

См. Этот ответ для получения информации о том, почему рекомендуется приводить к неподписанному символу.

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