2010-11-05 2 views
3

I posted a question о том, как получить пользовательский ввод, такой как ДА или НЕТ, для управления потоком программы, используя инструкции if else, я получил ответ и теперь я на шаг ближе к созданию этой работы, однако еще одна проблема возникла, мне действительно нужно, чтобы позволить несколько входов, например, это то, что им пытаются:Предоставление нескольких типов ввода для различных форм «да» и «нет» в C++

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; 
} 

Кирил Киров отправил этот код, который может help:

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

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

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

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


EDIT: Я сделал эту модификацию, но она по-прежнему не работает лучше, чем раньше, если я дать неправильно дело не идет к другой (ошибке) и нет, где добавить больше слов, (например, NO N нет нет):

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; 
} 
+0

Что можно сказать о 'станд :: строка :: find' решение может не получить работу? –

+2

«Я не мог заставить его работать» не говорит нам многого - можете ли вы быть более конкретным? –

+4

+1, потому что кто-то запустил без причины –

ответ

2

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

#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

ура! это работает ужасно, именно то, что я был после. – Joseph

0

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

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

Добавление к этому, прописная функция библиотеки C немного сложна в использовании.

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

Приветствия,

0

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

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

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

+0

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

+0

@DumbCoder: Я рассматриваю Boost (часть шаблонов) как доступную как стандартная библиотека. Я согласен, что это легко, но на самом деле библиотека String Algorithm стоит использовать, я просто видел слишком много дерьмовых строковых подпрограмм. –

0

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

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