Допускается несколько типов ввода для различных форм «да» и «нет» в C ++ - PullRequest
3 голосов
/ 05 ноября 2010

I опубликовал вопрос о том, как получить пользовательский ввод, такой как YES или NO, для управления потоком программы, используя операторы if else, я получил ответ, и теперь я на шаг ближе к созданиюэта работа, однако возникла другая проблема, мне действительно нужно разрешить несколько входов, например вот что я пытаюсь:

if (input == ("YES" || "yes" || "y" || "Yes" || "Y"))
{
    cout << "you said yes" << endl;
}
else if (input == "NO", "no", "n", "No","N")
{
    cout << "you said no" << endl;
}
else 
{
    cout <<  "ERROR!!!" << endl;
}

Кирилл Киров опубликовал этот код, который может помочь:

if( std::string::npos != input.find( "no" ) )

но я не мог заставить его работать, и Роджер Пэйт предложил это:

if (prompt && cin.tie()) {
*cin.tie() << prompt << (default_yes ? " [Yn] " : " [yN] ");

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


РЕДАКТИРОВАТЬ: Я сделал эту модификацию, но она все равно не работает лучше, чем раньше, если я дамв неправильном случае он переходит к другому (ошибка), и нет места, где можно добавить больше слов (например, НЕТ, НЕТ, НЕТ):

cout << "\nYES or NO" << endl;
string input ="";
cin >> input;

if ( std::string::npos != input.find( "yes" ) )
{
    cout << "you said yes" << endl;
}
else if ( std::string::npos != input.find( "no" ) )
{
    cout << "you said no" << endl;
}
else 
{
    cout <<  "ERROR!!!" << endl;
}

Ответы [ 4 ]

2 голосов
/ 05 ноября 2010

Добавить заголовки

#include <algorithm>
#include <cctype>

cout << "\nYES or NO" << endl; 
string input =""; 
cin >> input; 
transform (input.begin(), input.end(), input.begin(),tolower);

if ( (std::string::npos != input.find( "yes" )) || (std::string::npos != input.find( "y" )) ) 
{
     cout << "you said yes \n" ; 
}
else if ( (std::string::npos != input.find( "no" ) )  || (std::string::npos != input.find( "n" ) ) )
{
    cout << "you said no \n" ; 
}
else  
{
    cout <<  "ERROR!!! \n" ; 
}
0 голосов
/ 05 ноября 2010

Более простой способ - преобразовать регистр заранее. Предполагая, что пользователь ограничивает свой ввод одной из допустимых строк (да / нет).

Извлечение Boost.String , это набор алгоритмов для класса std::string (и, в частности, здесь подпрограммы преобразования регистра).

Это отлично подойдет для символов ASCII, но, поскольку мы говорим о std::string, это должно быть хорошо, вы не планируете работать с японским или арабским, а вы?

0 голосов
/ 05 ноября 2010

Как насчет того, чтобы просто проверить первые два символа строки и посмотреть, являются ли они n N или Y y?

Я давно не использовал строки C ++, но есть несколько функций, которые выглядят интересными,Взгляните на этот сайт.Например, вы можете взять длина строки.Тогда вы могли бы взять символов на нулевых позициях, один и, если доступно, два с использованием функций, которые мне нравились.После этого посмотрите, является ли первый символ Y, y, N, n.Вы можете продолжить, если хотите быть еще более уверенным в том, что пользователь не вводил глупости (если первая буква равна N или n, проверьте, если вторая в O или o и так далее), но я думаю, что этого должно быть достаточно для простого решения.

0 голосов
/ 05 ноября 2010

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

В стандартном C ++ прописные буквы, к сожалению, более сложны.Он должен с очень сильным сопротивлением иметь любую новую функцию, которая не работает идеально в каждом мыслимом случае.И заглавные буквы - это особенность, которая по своей природе - различна в разных странах, иногда даже зависит от контекста - не может отлично работать в каждом возможном случае.Функция верхнего регистра немного сложна для правильного использования.

Черт, я бы дал вам разумную функцию в верхнем регистре прямо здесь, но без времени.:-( Ищите более ранние вопросы о заглавных буквах. Это должно работать!: -)

Cheers,

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