Проверьте, содержит ли строка только символы в другой строке

#c

#c #c 11 #stdstring

Вопрос:

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

 bool ContainsOnly(std::string inputtedWord, std::string acceptableLetters)
{
    // ... how do I write this?
}
 

Вот мой фреймворк для тестирования:

 bool Tester(std::string inputtedWord, std::string acceptableLetters)
{
    if (ContainsOnly(inputtedWord, acceptableLetters)) {
        std::cout << "Good!" << std::endl;
        return true;
    }
    else {
        std::cout << "No good!" << std::endl;
        return false;
    }
}

int main()
{
    std::string acceptableLetters;
    std::string inputtedWord;

    std::cout << "Please input the acceptable letters in your words: " << std::endl;
    std::cin >> acceptableLetters;

    while (inputtedWord != "STOP") 
    {
        std::cout << "Please input the word you would like to test: (type STOP to end testing): " << std::endl;
        std::cin >> inputtedWord;
        Tester(inputtedWord, acceptableLetters);
    }
    return 0;
}
 

Я хочу получить следующий результат:

Пожалуйста, введите приемлемые буквы в ваших словах: КОДИРОВАНИЕ

Пожалуйста, введите слово, которое вы хотели бы протестировать: (введите STOP, чтобы завершить тестирование): МОНЕТА

Хорошо!

Пожалуйста, введите слово, которое вы хотели бы протестировать: (введите STOP, чтобы завершить тестирование): COP

Ничего хорошего!

Комментарии:

1. Вот простой способ выяснить, как это сделать, и он никогда не перестает работать. Просто достаньте чистый лист бумаги. Запишите, используя короткие, простые предложения на простом английском языке, пошаговый процесс выполнения этого. Когда закончите, позвоните своей резиновой утке, чтобы договориться о встрече . Мы не пишем код для других людей в Stackoverflow. Мы всегда обращаемся с такими вопросами к вашей резиновой утке. После того, как ваш резиновый утенок одобрит предложенный вами план действий, просто возьмите то, что вы записали, и переведите это непосредственно на C . Миссия выполнена!

Ответ №1:

Вы можете использовать find_first_not_of следующим образом:

 bool ContainsOnly(std::string inputtedWord, std::string acceptableLetters)
{
    return inputtedWord.find_first_not_of(acceptableLetters) == std::string::npos;
}
 

Вот демонстрация.

Ответ №2:

  1. Поместите все допустимые символы в std::set .
  2. Оцените, все ли символы в строках находятся в наборе через std::all_of .
 #include <set>
#include <algorithm>

bool ContainsOnly(std::string inputtedWord, std::string acceptableLetters)
{
     std::set<char> okSet(acceptableLetters.begin(), acceptableLetters.end());
     return std::all_of(inputtedWord.begin(), inputtedWord.end(),
                        [amp;okSet](char c) 
                        { 
                          return okSet.find(c) != okSet.end(); 
                        });
}
 

Комментарии:

1. Я отредактировал вопрос, чтобы поместить логику в функцию вместо if оператора, поэтому я также обновил ваш ответ. Надеюсь, все в порядке.